sqlite transaction事务操作

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


后来又发现人们评价说“
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. See sqlite.org/lang_transaction.htmlfor other variations on BEGIN that do attempt to obtain locks
老实说没看懂,大概是不建议用这个begin:::


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

//执行事务
@try {
sqlite3_exec(database,"BEGIN TRANSACTION",0,0,0);  //事务开始
NSString *s = [[NSString alloc] initWithUTF8String:[要执行的sql 语句  UTF8String]];
char *sql = (char *) [s UTF8String];
int r = sqlite3_exec( database, sql , 0, 0, 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]);
}

}
int result = sqlite3_exec(database,"COMMIT",0,0,&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, 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;
}



你可能感兴趣的:(sql,String,sqlite,table,Integer,database)