2015-07-20 52 views
0

我想批量写入一个字典数组到一个SQLite数据库使用SQLite事务的速度,因为数组可能会变得非常大。批量NSArray写入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数据库。

db表结构为:

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

任何想法?

+0

如果你不检查,你怎么知道没有错误? 'sqlite_step'的返回码是什么? –

+0

什么是'错误'?我没有看到你的代码中的任何地方。 –

+0

寻求调试帮助的问题(“为什么这个代码不工作?”)必须包含所需的行为,*特定问题或错误*以及在问题本身中重现问题所需的最短代码。 –

回答

1

除了需要添加更多的错误检查,您的INSERT是不正确的。你想:

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

这两个版本的工作(我的SQLite的知识很粗糙) “INSERT INTO livedata VALUES(NULL,@ device,@ datatype,@ timestamp,@ rawdata)” – duck1970