2009-07-31 18 views
1

Ich habe eine 2 MB große Datei, nicht zu groß, die ich in eine SQLite-Datenbank einfügen möchte, damit ich sie durchsuchen kann. Es gibt etwa 30.000 Einträge im CSV-Format mit sechs Feldern pro Zeile. Mein Verständnis ist, dass SQLite auf dem iPhone eine Datenbank dieser Größe verarbeiten kann.Lies große Datei in Sqlite-Tabelle in Objective-C auf iPhone

Ich habe ein paar Annäherungen gemacht, aber sie waren alle langsam> 30 s. Ich habe versucht:

1) C-Code verwenden, um die Datei zu lesen und die Felder in Arrays zu analysieren.

2) die folgende Objective-C-Code Mit Hilfe der Datei zu analysieren und sie in direkt in die SQLite-Datenbank setzen:

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 zu bekommen?

Oder ist es möglich, die Datei in ein SQLite-Format zu übersetzen, das direkt in SQLite gelesen werden kann?

Oder soll ich die Datei in einen Plist umwandeln und in ein Dictionary laden? Leider muss ich auf zwei der Felder suchen, und ich denke, dass ein Wörterbuch nur einen Schlüssel haben kann?


Louis, danke für Ihre Antwort.

Ich hätte erwähnen sollen, dass ich nur einmal am Anfang der App die Daten in die Datenbank schreiben will, und später muss ich nur noch die Datenbank lesen, keine schreibt.

Können Sie mir sagen, wie Sie die sqlite3-Datenbank direkt aus der CSV-Datei als Teil des Build-Prozesses generieren?

Antwort

1

OK, ich denke, ich habe es. Ausgehend von der Unix-Eingabeaufforderung liest die folgende in der CSV-Datei und schreibt eine SQL-Datei aus:

% sqlite3 
sqlite3> .mode csv 
sqlite3> create table NEWTABLE (ITEM_ID INTEGER PRIMARY KEY, FIELD0 TEXT, FIELD1 TEXT, FIELD2 TEXT, FIELD3 TEXT, FIELD4 TEXT, FIELD5 TEXT); 
sqlite3> .import csvfile.csv NEWTABLE 
sqlite3> .output csvfile.sql 
sqlite3> .dump NEWTABLE 

Das Teil habe ich noch nicht herausgefunden, ob es ein schneller Weg, um die SQL-Datei zu lesen, in sqlite3. Der Ansatz, den ich derzeit habe, ist es, jede Zeile der SQL-Datei zu lesen und auf dem iPhone auszuführen. Gibt es einen Ein-Zeilen-Ansatz zum Lesen der SQL-Datei in sqlite3?

+1

Sie möchten die Datei nicht ausgeben. Dadurch erhalten Sie eine serialisierte Reihe von SQL-Anweisungen, mit denen Sie eine Datenbank und nicht eine Datenbank selbst erstellen können.Einfach sqlite3 einen Pfad ausführen und dort wird die db-Datei "sqlite3/path/to/my/db" erstellt. Wenn diese Datei menschenlesbar ist, ist es nicht das, was Sie wollen. –

+0

Louis, kannst du mir den Befehl sagen, der "run sqlite3 a path" ausführt? Danke. –

+0

Meinen Sie so etwas wie: % sqlite3 newdatabase.sqlite

1

Ich denke, Sie sind verwirrt über was sqlite3 ist. Sqlite3 ist keine gespeicherte Datenbank, es ist eine persistente, datenträgerbasierte Datenbank, wenn Sie alle Ihre Daten in jedes Mal laden, wenn Sie etwas falsch machen. SQLite ist auf Persistenz ausgelegt, nachdem Sie alle Daten eingegeben haben, können Sie einfach die Datenbank schließen, und beim nächsten Öffnen mit sqlite3_open_v2() müssen Sie nicht alle Daten neu laden. Standardmäßig führt sqlite3 alle seine Commits atomar durch (was ein Teil davon ist, warum die Inserts langsam sind), also müssen Sie es nicht einmal technisch schließen (obwohl Sie es trotzdem tun sollten, nur um sicher zu sein, oder falls Sie es versuchen wollen) verbessern Sie die Leistung durch Verwendung von Transaktionen).

Tatsächlich, anstatt eine CSV-Datei mit der App zu integrieren, könnten Sie die sqlite3-Datenbank aus der CSV-Datei als Teil Ihres Build-Prozesses generieren und diese mit der App einbinden.