在Sqlite3 i-phone中插入值数组

时间:2011-08-25 09:05:50

标签: iphone objective-c cocoa-touch sqlite

我试图使用for循环在sqlite表中插入一组值。它只插入一组值。我在这里发布我的代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"myDatabase.sql"];

for(int i=0;i<[arr count];i++)
{
    sqlite3 *database;

    // Open the database from the users filessytem
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSLog(@"\n inserting data \n");
        sqlite3_exec(database, [[NSString stringWithFormat:@"INSERT INTO AnswerConnect VALUES('%@')",[arr objectAtindex:i] ] UTF8String], NULL, NULL, NULL);    
        //sqlite3_finalize(compiledStatement);
        sqlite3_close(database);
    }       
}

提前致谢。

2 个答案:

答案 0 :(得分:1)

不要那样做!不要像这样在循环中打开/关闭SQLite连接!从循环外部打开数据库的句柄,而不仅仅使用指针。在这种请求中插入格式是不安全的,因为SQL语句可能用某种注入代码编译。请改用sqlite3_stmt并将值绑定到它。此外,如果您只编译一个sqlite3_stmt实例并重复使用它,这将比您一直编译新语句提供更好的性能。

每个数据集中有多少列?它是否只插入单个数据集中的一个值,如string?

答案 1 :(得分:1)

您必须首先准备一个sqlite语句以在表中插入数据。试试这个:

sqlite3_stmt *statement = nil    
const char *sql = "insert into tablename (col1,col2) Values( ?, ?)";

if(sqlite3_prepare_v2(database, sql, -1, &statement, NULL) != SQLITE_OK)
{
     NSLog(@"Error while creating add statement. '%s'", sqlite3_errmsg(database));
}

for(int i=0;i<[arr count];i++)
{
      sqlite3_bind_text(statement, 1,[[arr objectAtindex:i] UTF8String] , -1, SQLITE_TRANSIENT);

     if(SQLITE_DONE != sqlite3_step(add_statement))
     {
    NSLog(@"Error while inserting result data. '%s'", sqlite3_errmsg(database));
     }
     //Reset the add statement.
     sqlite3_reset(statement);
}