IOS多執行緒讀寫Sqlite問題解決

2021-06-27 02:57:41 字數 4517 閱讀 9640

現在ios裡使用的資料庫一般都是sqlite,但是使用sqlite有個不太好的地方就是在多執行緒的時候,會出現問題,sqlite只能開啟乙個讀或者寫鏈結。這樣的話多執行緒就會碰到資源占用的問題。

最開始是使用fmdb,fmdb的早期版本不能解決這個問題,後來fmdb更新了,新版本的fmdb能夠很好的解決這個多執行緒使用sqlite 。

本文演示了使用fmdb通過多執行緒來讀和寫資料庫操作。

1.建立資料庫表,我採用的是firefox的sqlite manager 來建立的。

建表sql如下

create table "tbl_user" ("_id" integer primary key  autoincrement  not null , "name" varchar(30), "password" varchar(30))

2. 建立資料表的對映實體userentity

view source

print?

01.#import

02.

03.@inte***ce userentity : nsobject

04.

09.

10.@property (nonatomic, assign)intid;

11.@property (nonatomic, retain) nsstring *name;

12.@property (nonatomic, retain) nsstring *password;

13.@end

3. 建立運算元據庫的dao

view source

print?

01.//

02.//  dbdao.m

03.//  sqlitetest

04.//

05.//  created by foxwang on 12-4-9.

06.

07.//

08.

09.#import"dbdao.h"

10.#import"dbfilemanager.h"

11.

12.#import"fmdatabase.h"

13.#import"fmdatabaseadditions.h"

14.#import"fmdatabasepool.h"

15.#import"fmdatabasequeue.h"

16.#import"userentity.h"

17.

18.staticdbdao *gsharedinstance = nil;

19.

20.@implementationdbdao

21.@synthesizedbfile;

22.@synthesizedbqueue;

23.

24.+(dbdao *)sharedinstance

25.

31.returngsharedinstance;

32.}

33.

34.- (void)dealloc

35.

40.

41.- (id)init

42.

52.returnself;

53.}

54.

55.- (userentity *)rstouser:(fmresultset*)rs

56.

63.

64.- (void)adduser:(userentity *)user

65.];

72.}

73.

74.- (nsarray *)getusers;

75.

85.[db close];

86.}];

87.returnusers;

88.}

89.@end

4. 編寫測試方法

在didfinishlaunchingwithoptions 方法裡啟動3個執行緒 :2個執行緒寫,1個執行緒讀

IOS多執行緒讀寫Sqlite問題解決

現在ios裡使用的資料庫一般都是sqlite,但是使用sqlite有個不太好的地方就是在多執行緒的時候,會出現問題,sqlite只能開啟乙個讀或者寫鏈結。這樣的話多執行緒就會碰到資源占用的問題。最開始是使用fmdb,fmdb的早期版本不能解決這個問題,後來fmdb更新了,新版本的fmdb能夠很好的解...

解決IOS多執行緒讀寫Sqlite問題解決

現在ios裡使用的資料庫一般都是sqlite,但是使用sqlite有個不太好的地方就是在多執行緒的時候,會出現問題,sqlite只能開啟乙個讀或者寫鏈結。這樣的話多執行緒就會碰到資源占用的問題。最開始是使用fmdb,fmdb的早期版本不能解決這個問題,後來fmdb更新了,新版本的fmdb能夠很好的解...

SQLite 多執行緒

sqlite支援3種執行緒模式 單執行緒 這種模式下,沒有進行互斥,多執行緒使用不安全。禁用所有的mutex鎖,併發使用時會出錯。當sqlite編譯時加了sqlite threadsafe 0引數,或者在初始化sqlite前呼叫sqlite3 config sqlite config singlet...