2015-07-20 2 views
0

Я пытаюсь навалом написать массив словарей в SQLite db, используя SQLite Transaction для скорости, поскольку массив может стать довольно большим.Bulk NSArray write to SQLite

Код:

-(void)bulkCachetoSQLite:(NSArray *)dataToCache 
{ 
    //Logging Comment 
    NSLog(@"SQLiteClass - bulkCachetoSQLite"); 

    sqlite3_stmt *statement; 
    const char *dbpath = [_filePath UTF8String]; 
    char * sErrMsg = 0; 
    const char *tail = 0; 

    if(sqlite3_open(dbpath, &_DB) == SQLITE_OK){ 

     char sSQL [BUFFER_SIZE] = "\0"; 
     sprintf(sSQL, "INSERT INTO livedata (device,datatype,timestamp,rawdata)"); 

     sqlite3_prepare_v2(_DB, sSQL, BUFFER_SIZE, &statement, &tail); 
     sqlite3_exec(_DB, "BEGIN TRANSACTION", NULL, NULL, &sErrMsg); 

     for (NSObject* data in dataToCache) 
     { 
      //NSLog(@"%@",data); 

      sqlite3_bind_text(statement, 1, [[data valueForKey:@"device"] UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 2, [[data valueForKey:@"type"] UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 3, [[data valueForKey:@"timestamp"] UTF8String], -1, SQLITE_TRANSIENT); 

      NSString *str = [[NSString alloc] initWithData:[data valueForKey:@"data"] encoding:NSUTF8StringEncoding]; 
      sqlite3_bind_text(statement, 4, [str UTF8String], -1, SQLITE_TRANSIENT); 

      sqlite3_step(statement); 
      sqlite3_clear_bindings(statement); 
      sqlite3_reset(statement); 
     } 

     sqlite3_exec(_DB, "END TRANSACTION", NULL, NULL, &sErrMsg); 
     NSLog(@"SQLiteClass - bulkCachetoSQLite - EorrorA is %s", sErrMsg); 
    } 
    else{ 
     //db isn't open 
    } 
    NSLog(@"SQLiteClass - bulkCachetoSQLite - EorrorB is %s", sqlite3_errmsg(_DB)); 
    sqlite3_finalize(statement); 
    sqlite3_close(_DB); 
} 

Все кажется окей ОШИБКИ вернуть Null, но ничего не записывается его к БД SQLite.

Структура таблицы дб:

CREATE TABLE `livedata` (
    `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    `device` TEXT, 
    `datatype` TEXT, 
    `timestamp` TEXT, 
    `rawdata` TEXT 
); 

Любые идеи?

+0

Откуда вы знаете, нет ошибок, если вы не проверяете? Что такое код возврата из 'sqlite_step'? –

+0

А что такое 'ERRORS'? Я не вижу этого в вашем коде. –

+0

Вопросы поиска справки по отладке («почему этот код не работает?») Должны включать в себя желаемое поведение, * конкретную проблему или ошибку * и кратчайший код, необходимый для воспроизведения в самом вопросе. –

ответ

1

Кроме необходимости добавить намного больше ошибок, ваш INSERT неверен. Вы хотите:

char *sSQL = "INSERT INTO livedata (device,datatype,timestamp,rawdata) VALUES (?,?,?,?)"; 
+0

Обе версии работали (мои знания SQLite грубые) «INSERT INTO livingata VALUES (NULL, @ device, @ datatype, @ timestamp, @ rawdata)» – duck1970