Start a transaction with: sqlite3_exec(db, "BEGIN", 0, 0, 0);
Commit a transaction with: sqlite3_exec(db, "COMMIT", 0, 0, 0);
一下的代码是用transaction的,首先尝试了把两个sql语句链接在一起的,用一个sqlite3_prepare——似乎没成功,分开来写,也没成功,难道是有什么特别的?
//sqlite3_exec(database, "BEGIN", 0, 0, 0);
NSLog(@"querySql :%@",sql1);
NSLog(@"querySql :%@",sql2);
if(sqlite3_prepare_v2(database, [sql1 UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK && sqlite3_prepare_v2(database, [sql2 UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK)
{
//sqlite3_exec(database, "COMMIT", 0, 0, 0);
retValue=YES;
}
else {
//sqlite3_exec(database, "ROLLBACK", 0, 0, 0);
}
sqlite3_finalize(compiledStatement);
sqlite3_close(database);
后来我还是想了好多方法,至少sql语句看起来是可以的,在sql analzer里面是ok的,
if (sqlite3_exec (database, [updateSqlUTF8String], NULL,NULL, &errorMsg) != SQLITE_OK)
{
NSLog(@"upate error");
sqlite3_close(database);
return NO;
}
sqlite3_prepare_v2
后来我又看到这么段代码,觉得挺靠谱的:
【2】创建表格
//创建表格,假设有五个字段,(id,cid,title,imageData ,imageLen )
//说明一下,id为表格的主键,必须有。
//cid,和title都是字符串,imageData是二进制数据,imageLen 是该二进制数据的长度。
- (BOOL) createChannelsTable:(sqlite3*)db{
char *sql = "CREATE TABLE channels (id integer primary key, \
cid text, \
title text, \
imageData BLOB, \
imageLen integer)";
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(db, sql, -1, &statement, nil) != SQLITE_OK) {
NSLog(@"Error: failed to prepare statement:create channels table");
return NO;
}
int success = sqlite3_step(statement);
sqlite3_finalize(statement);
if ( success != SQLITE_DONE) {
NSLog(@"Error: failed to dehydrate:CREATE TABLE channels");
return NO;
}
NSLog(@"Create table 'channels' successed.");
return YES;
}