SQLite被锁定解决办法-iOS

第一次在项目中遇到使用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)

猜你喜欢

转载自blog.csdn.net/u012138272/article/details/55001978