Wie importiere ich ein CSV in SQlite

  • Antworten:16
mcfly
  • Forum-Beiträge: 286

05.08.2010, 18:58:51 via Website

Hallo zusammen

Ich versuche über ADB und SQlite3 ein csv in eine Tabelle zu laden. Ich befinde mich am PC und entwickle mit Eclipse eine App.
Datenbank und Tabelle ist vorhanden und ich kann per ADB und SQlite3 die Daten mit einem Select sehen. Die App läuft auch im Emulator.
CSV ist auch vorhanden.

Jetzt Problem
Ich kann das File aus SQlite mit dem .import Befehl nicht ansprechen, weil ich mich ( vermutung ) im Emulator befinde und mein CSV File befindet sich auf der Harddisk meines PC's. Wie kann ich auf diese Art oder ähnlich ein CSV importieren ?

Liebe Grüsse
McFly

Antworten
mcfly
  • Forum-Beiträge: 286

05.08.2010, 19:38:30 via Website

Habs zufälligerweise selber grad gefunden:

Mit der DDMS Perspective kann ich das File in den Emulator reinschieben und dann normal mit dem Import importieren. Natürlich gibts wieder Fehler aber ich bin ein Schritt weiter.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

06.08.2010, 09:48:17 via Website

Darf ich fragen, warum du die DB nicht einfach am PC pflegst und die fertigen Versionen dann jeweils aufs Handy überträgst?
Geht zB prima mit sqliteman.

Antworten
mcfly
  • Forum-Beiträge: 286

06.08.2010, 22:40:48 via Website

Kann man so eine preloaded db mit der apk mitdeployen ?

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

07.08.2010, 00:14:43 via Website

Das müßtest du mit deiner .csv Datei doch auch machen, oder? :P

Ja, kann man, allerdings muss sie dann AFAIR beim ersten Start aus dem assets Ordner an einen beschreibbaren Ort kopiert werden.

Als Alternative könntest du in Betracht ziehen, das die Spp die DB beim ersten Start von einem Server auf die Speicherkarte des Handy herunterlädt, denn das belastet den bei vielen Anwendern offenbar notorisch knappen internen Speicher nicht.

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

07.08.2010, 00:19:16 via Website

and dev
Das müßtest du mit deiner .csv Datei doch auch machen, oder? :P

Ja, kann man, allerdings muss sie dann AFAIR beim ersten Start aus dem assets Ordner an einen beschreibbaren Ort kopiert werden.

Als Alternative könntest du in Betracht ziehen, das die Spp die DB beim ersten Start von einem Server auf die Speicherkarte des Handy herunterlädt, denn das belastet den bei vielen Anwendern offenbar notorisch knappen internen Speicher nicht.

Der Satz gefällt mir !!! :cold::cold:

Ich würde es gefühlt und ohne bisher in die Verlegenheit gekommen zu sein aber ähnlich lösen .. Bei Bedarf via Inet die SQL - Init nachladen und insertieren.
Im übrigen ist das eine absolut übliche Vorgehensweise.

lg Voss

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

07.08.2010, 00:56:32 via Website

Der Satz gefällt mir !!!

Ich habe selber auch schon einige hundert Apps installiert, aber das meiste davon ersetzte dann eine vorher vorhandene App oder wurde später von einer besseren wieder ersetzt (oder wurde mangels Tauglichkeit gleich wieder entsorgt);
so habe ich nach wie vor reichlich Platz auf meinem Desire (genau wie auf dem Milestone)


Bei Bedarf via Inet die SQL - Init nachladen und insertieren.

Du meinst ein sql-dump herunterladen und die Statements dann ausführen?
Warum nicht gleich die sqlite-db fertig herunterladen?


Im übrigen ist das eine absolut übliche Vorgehensweise.

Macht ja auch aus vielen Gründen hochgradig Sinn;
so kann man zB App und Daten getrennt aktualisieren, belastet den Speicher nicht, nervt den User bei schnellebigen Daten nicht 3 mal die Woche mit Updates im Market (die sich dann tatsächlich nur auf Datenupdates beziehen, an denen der User in dieser Häufigkeit vielleicht gar nicht interessiert ist), ...

Antworten
mcfly
  • Forum-Beiträge: 286

07.08.2010, 09:31:10 via Website

Vielen Dank für eure Beiträge

Im Prinzip verstehe ich in etwa was ihr meint, aber bei der Umsetzung haperts dann. Sorry für die vielen kommenden Fragen :*) :

- Wie kann ich eine DB die nicht im Default Ordner /data/data/.... steht überhaupt mit der SQLiteOpenHelper ansprechen ?
super(context, "History8.db", null, DATABASE_VERSION);

- Wohin ( Pfad ) verschiebe ich die DB , die beim init im Assets liegt ?
- Wenn man für Froyo eine App schreibt, kann man die App dann nicht komplett ( mit db ) auf die SD-Karte speichern ?
- Oder wie kann ich eine DB von einem Server in ein Directory kopieren. Ich nehme an die Quelle wäre eine URL ?

- Gibt es da irgendwo ein Beispiel. Ich habe schon 2 Stunden gegoogelt.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

07.08.2010, 11:07:19 via Website

Ich bin gerade auf dem Sprung, daher nur in aller Kürze:
- Tutorial zum Umkopieren
- Froyo: ich meine die Tage in diesem Forum gelesen zu haben, das gerade die DBs beim Verschieben nicht auf die SD ausgelagert werden
- URL: es gibt massig Beispiele im Internet, wie man eine Datei herunterlädt (meist am Beispiel von Grafikfiles)
- Ziel wäre dann jeweils "/sdcard/app-name/..."

Schönes Wochenende :)

Antworten
mcfly
  • Forum-Beiträge: 286

07.08.2010, 13:12:36 via App

vielen herzlichen Dank. ich gehe dem nach ....
auch schönes Wochenende.

Antworten
mcfly
  • Forum-Beiträge: 286

08.08.2010, 14:08:53 via Website

Hi And Dev

Ich habs geschaft mit der Methode die DB von assets ins /data/data/Package/databases/ zu kopieren. Wirklich wunderbar. Vielen Dank.
Jetzt gibts aber doch noch ein Problem:
Ich schaffs nicht eine grössere db zu kopieren. eine 125kb geht. eine 1.5 MB geht nicht.

Weisst Du wie ich eine grössere DB kopieren könnte, oder hast Du sonst noch eine Idee, wie ich das schaff ?
l.G.

Ich verwende folgenden Code zum kopieren :

private void copyDataBase() throws IOException{

//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);

// Path to the just created empty db
String outFileName = DB_PATH ;//"/data/data/PACKAGE/databases/mydb.db";

//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);

//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}

//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();

}

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

08.08.2010, 18:30:17 via Website

Ich schaffs nicht eine grössere db zu kopieren. eine 125kb geht. eine 1.5 MB geht nicht.

* "Geht nicht" ist nicht sehr hilfreich bei der Fehlersuche ;) Wie äussert sich das? Was meint das Logfile?
* Dir ist schon klar, das du mit der Aktion mal eben 3MB Telefonspeicher belegst?
* Verdächtig kommt mir das hier vor: "Path to the just created empty db"... D.h. deine DB ist erzeugt und geöffnet, während du sie in deiner Kopier-Funktion überschreibst? Warum kopierst du sie nicht erst und öffnest sie danach?

Antworten
mcfly
  • Forum-Beiträge: 286

08.08.2010, 20:18:09 via App

Ich habe mit Tests versucht die db zu kopieren ohne sie vorher anzulegen. D.h. ich überschneide nichts. Das gleich ioexception problem habe ich, wenn ich ein grösseres csv lesen möchte. Wenn ich es verkleinere geht es. Es hat nichts mit dem Dateninhalt zu tun . Der fehler kommt sofort, bevor ich die erste Zeile gelesen habe. Es muss mit der Grösse zu tun haben.

Was will ich überhaupt machen: Ich hane eine Art Lexikon, das ich in einer app darstellen möchte. Dazu muss ich in einer db viele Daten vorgeladen haben. Ich dachte ich könnte eine db mitpacketolieren, aber das scheint nicht so einfach zu sein. Unterdessen habe ich den Dateninhalt in mehrer kleinere csv gesplittet und inserte das Zeugs in eine frisch erstellte db. Das dauert aber mehrere minuten. Das kann nicht die Lösung aein.

l.g.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

08.08.2010, 23:13:52 via Website

Wenn dein Logfile keine detailierteren Aussagen dazu macht, dann kann ich dir da auch nicht helfen, ich hab sowas mangels Bedarf noch nicht gemacht und daher keine Erfahrungen mit potentiellen Fallstricken.
Wenn das Splitten der .csv funktioniert, und du die DB nicht aus dem Internet herunterladen willst, dann könntest du versuchen, die DB zu splitten und beim ersten Start am Zielort zusammen zu setzen.

Antworten
mcfly
  • Forum-Beiträge: 286

09.08.2010, 21:09:05 via App

gute idee. das versuch ich. Vielleicht brauch ich dann noxhmals Hilfe :-). Übrigens Du hattest Recht: Die db's können nicht von der sdkarte gelesen werden. Hab ein Buch gekauft, dort stehts drin. Ich hoffe das Buch lügt.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

09.08.2010, 22:36:53 via Website

Vielleicht brauch ich dann noxhmals Hilfe :-)

Kein Problem :)


Übrigens Du hattest Recht: Die db's können nicht von der sdkarte gelesen werden.

Wo soll ich das denn behauptet haben? Du meinst wahrscheinlich "DBs können nicht direkt aus den Assets benutzt werden"...

DB auf SD funktioniert völlig problemlos, alle meine Apps arbeiten so.

Antworten
mcfly
  • Forum-Beiträge: 286

10.08.2010, 11:48:49 via Website

Sorry für die Behauptung. :*) Irgendjemand hat sowas geschrieben. Wunderbar, dann geht das also doch :-)

Antworten