CoreData和SQLite多線程訪問時的安全執行緒

來源:互聯網
上載者:User

標籤:

關於CoreData和SQLite多線程訪問時的安全執行緒問題

資料庫讀取操作一般都是多線程訪問的。在對資料進行讀取時,我們要保證其目前狀態不能被修改,即讀取時加鎖,否則就會出現資料錯誤混亂。
IOS中常用的兩種資料持久化儲存方式:CoreData和SQLite,兩者都需要設定安全執行緒,在這裡以FMDB來解釋對SQLite的安全執行緒訪問。

 

一:FMDB的安全執行緒:(以讀取圖片為例)

1.沒有安全執行緒的執行方式:

   //************** 資料庫儲存圖片  ******************//    FMDatabase *database = [FMDatabase databaseWithPath:[self getDatabasePath]];    //開啟資料庫    [database open];    NSString *sql = @"create table if not exists Test (id integer primary key autoincrement,name text,image blob);";    //建立表    [database executeUpdate:sql];    //把UIImage對象轉化為NSData    NSData *data = UIImagePNGRepresentation([UIImage imageNamed:@"user_browse"]);        //寫入資料    sql = @"insert into Test (name,image) values (?,?)";    [database executeUpdate:sql,@"張三",data];    //讀取顯示    sql = @"select * from Test;";    FMResultSet *resultSet = [database executeQuery:sql];    while (resultSet.next)    {        //[resultSet dataForColumn:@"image"];        NSData *imageData = [resultSet dataForColumnIndex:2];        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];        imageView.image = [UIImage imageWithData:imageData];        [self.view addSubview:imageView];    }

  2,使用線程隊列

//************** 資料庫安全執行緒 ***********//    FMDatabaseQueue *queue = [[FMDatabaseQueue alloc] initWithPath:[self getDatabasePath]];    [queue inDatabase:^(FMDatabase *db) {        //安全執行緒的        __block NSString *sql = @"create table if not exists Test (id integer primary key autoincrement,name text,image blob);";        //建立表        [database executeUpdate:sql];    }];    //插入資料    [queue inDatabase:^(FMDatabase *db) {        //寫入資料        sql = @"insert into Test (name,image) values (?,?)";        [database executeUpdate:sql,@"張三",data];    }];    //讀取    [queue inDatabase:^(FMDatabase *db) {        //讀取顯示        sql = @"select * from Test;";        FMResultSet *resultSet = [database executeQuery:sql];        while (resultSet.next)        {            //[resultSet dataForColumn:@"image"];            NSData *imageData = [resultSet dataForColumnIndex:2];            UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];            imageView.image = [UIImage imageWithData:imageData];            [self.view addSubview:imageView];        }    }];

  分析一下安全執行緒下的FMDB的實現:
在當使用FMDBDatabaseQueue建立資料庫時,會使用GCD建立一個線程隊列:

。。。 _queue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL);        dispatch_queue_set_specific(_queue, kDispatchQueueSpecificKey, (__bridge void *)self, NULL);        _openFlags = openFlags;。。。

  然後在讀取時調用[queue inDatabase:^(FMDatabase *db)方法,在block中會鎖定當前資料庫

dispatch_sync(_queue, ^() {        FMDatabase *db = [self database];        block(db);    ……}

  我們可以看到實際上這裡是對整個資料庫進行加鎖,以此來保證安全執行緒的。

 

二、CoreData的安全執行緒

1.沒有安全執行緒的coredata資料讀取:

NSManagedObjectContext對象的建立:_managedObjectContext = [[NSManagedObjectContext alloc] init];

插入資料操作:(AppDetailModal為資料模型)

context 為返回的 _managedObjectContext

AppDetailModal *newapp = [NSEntityDescription insertNewObjectForEntityForName:TableName inManagedObjectContext:context];

其他查詢、更新、刪除操作
//擷取Entity

    NSEntityDescription *entity = [NSEntityDescription entityForName:TableName inManagedObjectContext:context];

  

2.安全執行緒的coreData操作:

首先建立並行的NSManagedObjectContext對象

NSManagedObjectContext* context=[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

  

然後在執行讀取操作時使用一下兩個方法:-(void)performBlock:(void (^)(void))block-(void)performBlockAndWait:(void (^)(void))block

  

[context performBlock:^{        //要執行的讀取操作 }];

  

CoreData和SQLite多線程訪問時的安全執行緒

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.