加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

sqlite transaction事务操作

发布时间:2020-12-12 20:30:12 所属栏目:百科 来源:网络整理
导读:Start a transaction with: sqlite3_exec(db,"BEGIN",0); Commit a transaction with: 一下的代码是用transaction的,首先尝试了把两个sql语句链接在一起的,用一个sqlite3_prepare——似乎没成功,分开来写,也没成功,难道是有什么特别的? //sqlite3_exec

Start a transaction with:sqlite3_exec(db,"BEGIN",0);

Commit a transaction with:

一下的代码是用transaction的,首先尝试了把两个sql语句链接在一起的,用一个sqlite3_prepare——似乎没成功,分开来写,也没成功,难道是有什么特别的?

//sqlite3_exec(database,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],NULL) == SQLITE_OK)

{

//sqlite3_exec(database,0);

retValue=YES;

}

else {

//sqlite3_exec(database,"ROLLBACK",0);

}

sqlite3_finalize(compiledStatement);

sqlite3_close(database);


后来我还是想了好多方法,至少sql语句看起来是可以的,在sql analzer里面是ok的,

if (sqlite3_exec (database,[updateSqlUTF8String],NULL,&errorMsg) != SQLITE_OK)

{

NSLog(@"upate error");

sqlite3_close(database);

return NO;

}



sqlite3_prepare_v2


后来又发现人们评价说“ BEGIN is a deferred operation. Deferred means that no locks are acquired on the database until the database is first accessed. Thus with a deferred transaction,the BEGIN statement itself does nothing to the filesystem. Locks are not acquired until the first read or write operation. Seesqlite.org/lang_transaction.htmlfor other variations on BEGIN that do attempt to obtain locks ” 老实说没看懂,大概是不建议用这个begin:::


后来我又看到这么段代码,觉得挺靠谱的:

//执行事务 @try { sqlite3_exec(database,"BEGIN TRANSACTION",0); //事务开始 NSString *s = [[NSString alloc] initWithUTF8String:[要执行的sql 语句 UTF8String]]; char *sql = (char *) [s UTF8String]; int r = sqlite3_exec( database,sql,0 ); if(r != SQLITE_OK){ //NSLog(@" sql: %@",s); //NSLog(@"r = %d",r); } NSLog(@"updateSql %@",ssql); NSLog(@"r = %d",r); [s release]; } @catch (NSException * em) { NSLog(@"failed to read %@",[em description]); } @finally { //NSLog(@"failed to read %@",[e description]); }
} intresult = sqlite3_exec(database,&error); //COMMIT 我觉得这次应该i哦y验 饿 我把其中一个update搞失败? 找不到key?

【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,&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; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读