Lesen Sie große Datei in sqlite-Tabelle in objective-C auf dem iPhone
Ich habe eine 2 MB-Datei nicht zu groß ist, dass ich gerne in eine sqlite-Datenbank, so dass ich es suchen. Es gibt über 30K Einträge im CSV-format, mit sechs Feldern pro Zeile. Mein Verständnis ist, dass sqlite auf dem iPhone verarbeiten kann, eine Datenbank dieser Größe.
Habe ich ein paar Ansätze, aber Sie wurden alle langsam > 30 s. Ich habe versucht:
1) Mit C-code, um die Datei Lesen und Parsen der Felder in arrays.
2) unter Verwendung der folgenden Objective-C-code analysieren Sie die Datei und legen Sie es in direkt in die sqlite-Datenbank:
NSString *file_text = [NSString stringWithContentsOfFile: filePath usedEncoding: NULL error: NULL];
NSArray *lineArray = [file_text componentsSeparatedByString:@"\n"];
for(int k = 0; k < [lineArray count]; k++){
NSArray *parts = [[lineArray objectAtIndex:k] componentsSeparatedByString: @","];
NSString *field0 = [parts objectAtIndex:0];
NSString *field2 = [parts objectAtIndex:2];
NSString *field3 = [parts objectAtIndex:3];
NSString *loadSQLi = [[NSString alloc] initWithFormat: @"INSERT INTO TABLE (TABLE, FIELD0, FIELD2, FIELD3) VALUES ('%@', '%@', '%@');",field0, field2, field3];
if (sqlite3_exec (db_table, [loadSQLi UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(db_table);
NSAssert1(0, @"Error loading table: %s", errorMsg);
}
Bin ich etwas fehlt? Kennt jemand einen schnellen Weg, um die Datei in eine Datenbank?
Oder ist es möglich, übersetzen Sie die Datei in eine sqlite-format gelesen werden können, können direkt in sqlite?
Oder sollte ich die Datei in eine plist und legen Sie Sie in einem Wörterbuch? Leider muss ich die Suche auf zwei Bereiche, und ich denke, ein Wörterbuch kann nur noch einen Schlüssel haben?
Louis, vielen Dank für Ihre Antwort.
Ich sollte erwähnt haben, dass ich nur schreiben wollen, die Daten in die Datenbank einmal am Anfang der app, und dann später ich brauche nur zu tun, liest der Datenbank, keine schreibt.
Können Sie mir sagen, wie zu generieren der sqlite3-Datenbank direkt aus der CSV-Datei als Teil des build-Prozesses?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ugh... beschäftigen sich nicht mit der C-API selbst. Vor allem nicht, wenn es gibt schönere Wrapper verfügbar: http://cocoaheads.byu.edu/resources/sqlite
Ich denke, Sie sind verwirrt darüber, was sqlite3 ist. Sqlite3 ist nicht eine in-memory-Datenbank, es ist ein dauerhafter disk-basierte Datenbank, wenn Sie sind, laden Sie alle Ihre Daten an jedes mal, wenn Sie etwas falsch machen. SQLite ist konzipiert für die Persistenz, nach dem eingeben aller Daten in diese können Sie einfach schließen, die db, und das nächste mal, wenn Sie öffnen es mit sqlite3_open_v2(), keine Notwendigkeit, neu zu laden, alle Daten. Standardmäßig sqlite3 hat alle seine commits atomar (das ist ein Teil, warum sind die inserts langsamer), so dass Sie nicht einmal technisch brauchen, um es zu schließen (obwohl Sie immer noch, nur um sicher zu sein, oder im Fall, dass Sie wollen, um zu versuchen, um die Leistung zu verbessern durch die Verwendung von Transaktionen).
In der Tat, als auch eine CSV-Datei mit der app, die Sie erzeugen könnte die sqlite3-Datenbank aus der CSV-Datei als Teil Ihrer build-Prozess gehören, dass mit der app.
OK, ich denke ich habe es. Ausgehend von der Unix-Eingabeaufforderung, die folgenden liest, die in der CSV-Datei und schreibt Sie sich eine SQL-Datei:
Den Teil, den ich noch habe nicht herausgefunden, ist, wenn es ist ein schneller Weg, um Lesen Sie die sql-Datei in sqlite3. Der Ansatz, den ich derzeit habe ist, Lesen Sie jede Zeile der sql-Datei, und führen Sie auf dem iPhone. Ist es eine one-line-Ansatz, um das Lesen der sql-Datei in sqlite3?