SQLite被锁定解决办法-iOS

来源:互联网 发布:nginx 第三方模块开发 编辑:程序博客网 时间:2024/05/17 22:56

第一次在项目中遇到使用SQLite,之前写Android的时候同样的流程没有出错。
Android对SQLite的”增删改查”——SQLiteDatabase
Android SQLite操作之“SQLiteOpenHelper”
这里也可能我只是写了一个Demo,就一个页面,所以没有发现那个错误。但是iOS的APP我是多处使用SQLite,而且我是把SQLite的操作写在Controller之外以接口方式使用的。
于是在页面跳转往复的过程中出现了SQLite被锁定的情况。查了一些资料:SQLite只能支持单线程,或者说SQLite不能被同时登录。于是我查了一下我写的函数,每个都是打开数据库开始,关闭数据库结尾,明着看没什么问题。后来急着上线,就写了单例模式去访问数据库,最终解决问题。
DBSQLite.m关键代码:

+ (DBSQLite *)sharedDataBaseHandle{    static DBSQLite *manager = nil;    if (manager == nil) {        manager = [[DBSQLite alloc] init];    }    return manager;}static sqlite3 * db = nil;  //设置句柄 通过句柄对数据库进行操作-(sqlite3 *)openDB{    if (db != nil) {        return db;    }    NSArray *test = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);    NSString * fileName = [[test lastObject]stringByAppendingPathComponent:@"dbname.db"];    sqlite3_open(fileName.UTF8String, &db);    return db;}

关闭SQLite

-(void)closeDB{    if (sqlite3_close(db) == SQLITE_OK){        db = nil;    } else {}}

这样保证db只被实例化一次,通过db这个句柄完成对SQLite的操作。
最后Controller中调用

DBSQLite * db = [DBSQLite sharedDataBaseHandle];[_db.functionname()];

具体对SQLite的操作和代码注释可以参考iOS SQLite3 “增删改查”(Objective-C)

0 0
原创粉丝点击