我试图使用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);
}
}
提前致谢。
答案 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);
}