iOS中FMDB的使用

2021-08-31 13:43:21 字數 3421 閱讀 7670

在ios開發中,如果本地需要做大量的快取,fmdb用的是比較多的,怎麼整合到專案中我這裡就不說了,主要說一下fmdb使用的乙個思路和自己遇到的坑。

在我自己開發聊天系統的時候,我一般是用fmdb用來快取最近聯絡人列表和使用者的聊天訊息列表。因為聊天系統,涉及到的讀和寫比較頻繁,所以我會封裝乙個單例類用來處理每個部分的資料儲存和讀寫。

下面是用來管理最近聯絡人快取的功能實現,其餘的模組也可以按照這樣的模式來,封裝好方法,操作的時候直接調方法即可,比較方便。

先看一下.h檔案的**,這樣大致就可以知道這個類主要用來幹什麼:

#import @class fmdatabase;

@inte***ce ******chatcache : nsobject

+(instancetype)sharedchatcache;

//設定使用者uid

-(bool)initialize:(nsstring*)myuserid;

-(void)uninitialize;

//獲取所有使用者資訊

-(void)getuserall:(void(^)(nsmutablearray*))callback;

//插入或者更新新的資料

-(void)upsert:(nsdictionary*)data;

//設定某個使用者未讀資訊條數為0

-(void)setunreadnum:(nsstring*)targetuserid andnum:(int)num;

//設定某個群未讀資訊條數為0

-(void)setgroupunreadnum:(nsstring *)targetgroupid andnum:(int)num;

//獲取未讀訊息數

-(void)getunreadnum:(nsstring*)targetuserid andcallback:(void(^)(int))callback;

//獲取某個群未讀條數

-(void)getgroupunreadnum:(nsstring *)targetgroupid andcallback:(void(^)(int))callback;

//刪除某人的聊天記錄

-(void)remove:(nsstring*)targetuserid;

//刪除某一條群聊

-(void)removegroup:(nsstring *)groupid;

//清理資料,除了世界聊天

-(void)clearcacheswithoutworld;

@end

.m檔案:

#import "******chatcache.h"

#import "fmdb.h"

fmdatabasequeue* __g_db = nil;

@inte***ce ******chatcache()

@end

@implementation ******chatcache

+(instancetype)sharedchatcache

});return sharedrunner;

}-(bool)initialize:(nsstring*)myuserid

return (__g_db != nil);

}-(void)uninitialize

-(void)dealloc

nslog(@"******chatcache dealloc");

}-(void)createtable

} else

}];});

}-(void)upgradetable:(fmdatabase*)db

-(void) checktablestruct

//獲取所有使用者資訊

-(void)getuserall:(void(^)(nsmutablearray*))callback

[rs close];

dispatch_async(dispatch_get_main_queue(), ^

});}];

});}//插入或者更新新的資料

-(void)upsert:(nsdictionary*)data

}elseelse

[db executeupdate:sql];

}}else else

[db executeupdate:sql];

} else

} }];

});}//設定某個使用者未讀資訊條數為0

-(void)setunreadnum:(nsstring*)targetuserid andnum:(int)num ];

});}//設定某個群未讀資訊條數為0

-(void)setgroupunreadnum:(nsstring *)targetgroupid andnum:(int)num

]; });

}//獲取未讀訊息數

-(void)getunreadnum:(nsstring*)targetuserid andcallback:(void(^)(int))callback

});}];

});}//獲取某個群未讀條數

-(void)getgroupunreadnum:(nsstring *)targetgroupid andcallback:(void(^)(int))callback

});}];

});}-(void)remove:(nsstring*)targetuserid ];

});}//刪除某一條群聊

-(void)removegroup:(nsstring *)groupid

]; });

}//清理資料

-(void)clearcacheswithoutworld ];

});}@end

我們會看到單例例項化的時候有這樣一句**:

if(!__g_db)
這句**可以保證整個程式中只存在乙個fmdatabasequeue的例項物件。

因為首先fmdatabase是不具備執行緒安全的,如果兩個執行緒中同時運算元據庫,就會」is currently in use」 ;fmdatabasequeue其實是乙個序列的排程佇列(g-c-d),資料庫的操作必須是順序執行,不能兩個資料庫的操作同時執行,如果是兩個執行緒各自建立了fmdatabasequeue的例項,執行緒同時執行時,就會出現相同的資料庫操作同時觸發,導致」database is locked「,所以如果是乙個fmdatabasequeue例項下,多個執行緒下同時操作,其實是在排在同乙個佇列中逐一操作的,沒有同時操作。這樣就可以保證fmdatabase的資料是執行緒安全的。

所以在使用fmdb的時候一定要使用fmdatabasequeue,這個是fmdb用來管理資料庫的,可以避免很多麻煩。

另外需要注意的是在使用sql語句的時候,如果涉及到字串,佔位符就需要使用單引號,否則也會遇到問題。

iOS中FMDB的使用

1什在日常的開發中,我們需要用到離線快取將資料資訊存入資料庫,在沒有網路的時候進行載入,而我們ios用的就是sqlite3資料庫,用原生的sql我們也能實現,但是書寫起來比較麻煩,尤其是其它語言轉過來的程式設計師會感覺吃力,下面我們介紹一款比較優秀還簡單的第三方fmdb 4 fmdb常用類 fmda...

iOS開發 FMDB的使用

獲取沙盒路徑 nsarray filepath nssearchpathfordirectoriesindomains nsdocumentdirectory,nsuserdomainmask,yes nsstring documentpath filepath objectatindex 0 ns...

iOS開發 FMDB使用

demo位址 nslog path database fmdatabase alloc initwithpath path id欄位為自增欄位 name char 256位 age char 3位 char 2位 phone char 13位 address char 100位的 if databa...