首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Objective-c中使用sqlite3_exec做事务,没有达到预期的效果

问在Objective-c中使用sqlite3_exec做事务,没有达到预期的效果
EN

Stack Overflow用户
提问于 2012-10-17 23:00:05
回答 1查看 2.7K关注 0票数 2

早上好啊!

我目前正在用Objective-c开发一个iOS应用程序,并且我有一个本地数据库,允许用户通过互联网进行更新。数据库可能会在短短几天内发生相当大的变化,因此可能会减少到几行,而在此之前有数十万行(不太可能,但仍然如此)。

我在数据库上运行了select查询之前,而和之后,但总是找到应该删除的数据。

以下是代码

代码语言:javascript
复制
@try {
    if(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK){
        //Db exists and can be open
        sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0);
        sqlite3_stmt *stmt;
        const char *query = [[NSString stringWithFormat:@"DELETE FROM %@ 
                                                          WHERE ? = '?'", table] UTF8String];
        if(sqlite3_prepare_v2(db, query, -1, &stmt, NULL)== SQLITE_OK)
        {
            //integer i = 0
            //PrimaryKey contains k primaryKeys
            for(int i=0; i<[primaryKey count]; i++){
                //i = j < k
                sqlite3_bind_text(stmt, 1, (const char *)[parameters UTF8String]
                 , [parameters lengthOfBytesUsingEncoding:NSUTF8StringEncoding], SQLITE_STATIC);
                sqlite3_bind_text(stmt, 2, 
             (const char *)[[primaryKey objectAtIndex:i] UTF8String]
            , [[primaryKey objectAtIndex:i] lengthOfBytesUsingEncoding:NSUTF8StringEncoding ]
            , SQLITE_STATIC);

                if (sqlite3_step(stmt) != SQLITE_DONE){
                    NSLog(@"Delete commit failed. Error %s", sqlite3_errmsg(db));
                    return NO;
                }
                if(sqlite3_reset(stmt)!= SQLITE_OK){
                    NSLog(@"SQL error %s", sqlite3_errmsg(db));
                    return NO;
                }
            }
            //i = k
        }
        if(sqlite3_exec(db, "COMMIT TRANSACTION", 0, 0, 0) != SQLITE_OK){
            NSLog(@"SQL error %s", sqlite3_errmsg(db));

            return NO;
        }
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return YES;
    }
    NSLog(@"SQL error %s", sqlite3_errmsg(db));
    sqlite3_close(db);
    return NO;
}
@catch (NSException *exception) {
    NSLog(@"%@", [exception reason]);
    return NO;
}

从那些更习惯于在sqlite中使用事务的人那里得到的任何帮助或提示都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-17 23:08:25

您没有检查以下结果

代码语言:javascript
复制
sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0);

中有额外的引号

代码语言:javascript
复制
WHERE ? = '?'

在sqlite3_bind_text中不需要这些引号

我怀疑您正在尝试为参数% 1绑定列名。您不能在SQLite中这样做。sqlite3_prepare_v2需要知道列名;您的查询只是将列名与参数2进行比较。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12937288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档