Domanda

Ho un file da 2 MB, non troppo grande, che vorrei inserire in un database sqlite per poterlo cercare. Esistono circa 30.000 voci in formato CSV, con sei campi per riga. La mia comprensione è che sqlite su iPhone può gestire un database di queste dimensioni.

Ho adottato alcuni approcci ma sono stati tutti lenti > 30 s. Ho provato:

1) Utilizzo del codice C per leggere il file e analizzare i campi in array.

2) Utilizzando il seguente codice Objective-C per analizzare il file e inserirlo direttamente nel database sqlite:

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);
    }

Mi sto perdendo qualcosa? Qualcuno sa un modo veloce per ottenere il file in un database?

O è possibile tradurre il file in un formato sqlite che può essere letto direttamente in sqlite?

O dovrei trasformare il file in un plist e caricarlo in un dizionario? Purtroppo devo cercare su due dei campi e penso che un dizionario possa avere una sola chiave?


Louis, grazie per la tua risposta.

Avrei dovuto menzionare che desidero scrivere i dati nel database solo una volta all'inizio dell'app, quindi in seguito ho solo bisogno di fare letture del database, nessuna scrittura.

Puoi dirmi come generare il database sqlite3 direttamente dal file CSV come parte del processo di compilazione?

È stato utile?

Soluzione 3

OK, penso di averlo. A partire dal prompt dei comandi di Unix, quanto segue legge nel file CSV e scrive un file SQL:

 % 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

La parte che ancora non ho capito è se c'è un modo rapido per leggere il file sql in sqlite3. L'approccio che ho attualmente è quello di leggere ogni riga del file sql ed eseguire su iPhone. Esiste un approccio a una riga per leggere il file sql in sqlite3?

Altri suggerimenti

Ugh ... non occuparti tu stesso dell'API C. Soprattutto quando sono disponibili wrapper più belli: http://cocoaheads.byu.edu/resources/sqlite

Penso che tu sia confuso riguardo a sqlite3. Sqlite3 non è un database in memoria, è un database persistente basato su disco, se stai caricando tutti i tuoi dati ogni volta che stai facendo qualcosa di sbagliato. SQLite è progettato per la persistenza, dopo aver inserito tutti i dati in esso puoi semplicemente chiudere il db e la prossima volta che lo apri usando sqlite3_open_v2 () , non è necessario ricaricare tutti i dati. Di default sqlite3 esegue tutti i suoi commit atomicamente (che è parte del motivo per cui gli inserti sono lenti), quindi non è nemmeno necessario tecnicamente chiuderlo (anche se dovresti, solo per sicurezza, o nel caso tu voglia provare a migliorare le prestazioni utilizzando le transazioni).

In effetti, anziché includere un file CSV con l'app, è possibile generare il database sqlite3 dal file CSV come parte del processo di compilazione e includerlo nell'app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top