Как изменить максимальную глубину дерева выражений SQLite с помощью FMDB SDK?

Я использую FMDB для реализации приложений на основе SQLite, которым мне нужно вставить большой объем данных в SQLite, скажем, 1000 строк данных, но я не хочу вставлять их один за другим, я просто хочу сделать это с помощью одного запрос, это значительно ускорит вставку, например:

NSString *query = @"insert into table (c1,c2,c3,c4) values " ;
NSString *middle = @"" ;
for ( int i = 0 ; i < 1000 ; i++ ) {

    NSDictionary *tmpItem = [data objectAtIndex:i] ;

    if ( i == 999 ) {

        middle = [NSString stringWithFormat:@"%@('%@','%@','%@','%@')", middle,[tmpItem objectForKey:@"c1"],[tmpItem objectForKey:@"c2"],[tmpItem objectForKey:@"c3"],[tmpItem objectForKey:@"c4"]] ;
    }

    else {

        middle = [NSString stringWithFormat:@"%@('%@','%@','%@','%@') ,", middle,[tmpItem objectForKey:@"c1"],[tmpItem objectForKey:@"c2"],[tmpItem objectForKey:@"c3"],[tmpItem objectForKey:@"c4"]] ;
    }
}

query = [NSString stringWithFormat:@"%@%@", query, middle] ;
[db executeUpdate:query];

Приведенный выше код не может вставить какие-либо данные в «таблицу», но когда я изменяю цикл for для запуска только 10 раз, данные вставляются правильно, это означает, что синтаксической ошибки нет.

Я попробовал по ошибке, что данные вставляются правильно с циклом for, установленным на i‹500, при настройке i‹501 данные не вставляются.

Затем я ищу http://www.sqlite.org/limits.html , есть < strong>Maximum Depth Of An Expression Tree на этой странице, и это должно быть то, что я хочу установить, но как я могу установить это свойство при использовании FMDB?

Или единственный способ, которым я могу вставить большой объем данных, - это просто вставить их один за другим?


person Man Lung Chan    schedule 15.01.2014    source источник
comment
Прочтите файл readme FMDB и обратите внимание на часть Использование FMDatabaseQueue.   -  person iOS Dev    schedule 15.01.2014
comment
Извините, но я читаю эту часть. Я не использую объект FMDatabase в другом потоке, это единственная операция, которую я использовал с объектом FMDatabase.   -  person Man Lung Chan    schedule 15.01.2014


Ответы (1)


Ваши варианты не ограничены одним или всеми одновременно.

Вы можете вставлять данные партиями, что по-прежнему даст вам прирост скорости, но также будет более предсказуемым в случае успеха. Изменение ограничений по-прежнему остается ограничением (и есть и другие, которые вы можете использовать в зависимости от данных). Пакетирование по 100 штук за раз кажется разумным.

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

В дополнение к этому, предоставленная вами ссылка sqlite имеет настройки компиляции препроцессора, если вы компилируете свой собственный двоичный файл sqlite. FMDB — это просто оболочка над sqlite, и по умолчанию в iOS вы получаете sqlite, упакованный с iOS. Конечно, вы можете скомпилировать свой собственный с измененными ограничениями и связать его со своим приложением.

Таким образом, вам нужно будет перекомпилировать и связать с ограничением 0. Обратите внимание, что вызов ограничения времени выполнения позволяет вам понижать скомпилированное ограничение только в том случае, если оно установлено выше 0 (по умолчанию 100).

Максимальная глубина дерева выражений может быть уменьшена во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size), если значение SQLITE_MAX_EXPR_DEPTH изначально положительное. Другими словами, максимальная глубина выражения может быть уменьшена во время выполнения, если уже существует ограничение времени компиляции для глубины выражения. Если SQLITE_MAX_EXPR_DEPTH установлен на 0 во время компиляции (если глубина выражений не ограничена), то sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size) не работает.

person bryanmac    schedule 15.01.2014
comment
Спасибо за ответ @bryanmac, теперь я буду собирать по 100 данных за раз, так как это все же быстрее, чем вставлять данные по одному, хотя мне не нужно менять лимит - person Man Lung Chan; 16.01.2014