Прочитать большой файл в таблицу sqlite в target-C на iPhone - PullRequest
1 голос
/ 31 июля 2009

У меня есть файл размером 2 МБ, не слишком большой, который я хотел бы поместить в базу данных sqlite, чтобы я мог найти его. Есть около 30 тысяч записей в формате CSV с шестью полями на строку. Насколько я понимаю, sqlite на iPhone может обрабатывать базу данных такого размера.

Я выбрал несколько подходов, но все они были медленными> 30 с. Я пробовал:

1) Использование кода C для чтения файла и разбивки полей на массивы.

2) Использование следующего кода Objective C для анализа файла и помещения его непосредственно в базу данных 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);
    }

Я что-то упустил? Кто-нибудь знает быстрый способ получить файл в базу данных?

Или возможно перевести файл в формат sqlite, который можно прочитать непосредственно в sqlite?

Или я должен превратить файл в plist и загрузить его в словарь? К сожалению, мне нужно выполнить поиск по двум полям, и я думаю, что словарь может иметь только один ключ?


Луи, спасибо за ваш ответ.

Я должен был упомянуть, что я хочу записать данные в базу данных только один раз в начале приложения, а затем позже мне нужно только выполнить чтение базы данных, без записи.

Можете ли вы рассказать мне, как создать базу данных sqlite3 непосредственно из файла CSV в процессе сборки?

Ответы [ 3 ]

2 голосов
/ 30 сентября 2009

Тьфу ... не разбирайся с C API самостоятельно. Особенно, когда есть более приятные обертки: http://cocoaheads.byu.edu/resources/sqlite

1 голос
/ 02 августа 2009

ОК, я думаю, что понял. Начиная с командной строки Unix, в файл CSV читает и записывает файл 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

Часть, которую я до сих пор не выяснил, это быстрый способ чтения файла sql в sqlite3. Подход, который я сейчас использую, заключается в том, чтобы прочитать каждую строку файла sql и выполнить на iPhone. Есть ли однострочный подход к чтению файла sql в sqlite3?

1 голос
/ 31 июля 2009

Я думаю, вы не понимаете, что такое sqlite3. Sqlite3 - это не база данных в памяти, это постоянная дисковая база данных, если вы загружаете все свои данные каждый раз, когда делаете что-то не так. SQLite разработан для постоянного хранения, после ввода всех данных в него вы можете просто закрыть базу данных, и в следующий раз, когда вы откроете ее, используя sqlite3_open_v2 () , нет необходимости перезагружать все данные. По умолчанию sqlite3 выполняет все свои коммиты атомарно (что является частью того, почему вставки медленные), поэтому вам даже технически не нужно закрывать его (хотя вы все равно должны это делать, просто чтобы быть в безопасности, или в случае, если вы хотите попробовать повысить производительность с помощью транзакций).

На самом деле, вместо включения файла CSV в приложение, вы можете сгенерировать базу данных sqlite3 из файла CSV как часть процесса сборки и включить ее в приложение.

...