使用 YTKKeyValueStore 做 iOS離線緩存(FMDB)

另一種

JQFMDB

FMDB的封裝,操作簡單,線程安全,擴展性強,直接操作model或dictionary


YTKKeyValueStore介紹

YTKKeyValueStore是iOS端的一個 Key-Value 存儲類庫婿禽。

封裝了fmdb烈疚,使用Key-Value式的存儲。在存儲量不大的情況下嘴脾,開發(fā)上的效率優(yōu)勢很大:

1.Model層的代碼編寫簡單,易于測試草姻。

2.由于Value是JSON格式宙搬,所以在做Model字段更改時,易于擴展和兼容些举。

安裝

在 Podfile 中加入下面一行代碼來使用YTKKeyValueStore

pod ‘YTKKeyValueStore’

也可以手動添加源碼 YTKKeyValueStore.h和YTKKeyValueStore.m 到你的工程中,并且在工程設(shè)置的Link Binary With Libraries中俭厚,增加libsqlite3.dylib

使用

所有的接口都封裝在YTKKeyValueStore類中户魏。以下是一些常用方法說明。

打開(或創(chuàng)建)數(shù)據(jù)庫

// 打開名為test.db的數(shù)據(jù)庫挪挤,如果該文件不存在叼丑,則創(chuàng)新一個新的。

YTKKeyValueStore *store = [[YTKKeyValueStore alloc] initDBWithName:@"test.db"];

創(chuàng)建數(shù)據(jù)庫表

YTKKeyValueStore *store = [[YTKKeyValueStore alloc] initDBWithName:@"test.db"];

NSString *tableName = @"user_table";

// 創(chuàng)建名為user_table的表扛门,如果已存在鸠信,則忽略該操作

[store createTableWithName:tableName];

讀寫數(shù)據(jù)

YTKKeyValueStore類提供key-value的存儲接口,存入的所有數(shù)據(jù)需要提供key以及其對應(yīng)的value论寨,讀取的時候需要提供key來獲得相應(yīng)的value星立。

YTKKeyValueStore類支持的value類型包括:NSString, NSNumber, NSDictionary和NSArray,為此提供了以下接口:

- (void)putString:(NSString *)string withId:(NSString *)stringId intoTable:(NSString *)tableName;

- (void)putNumber:(NSNumber *)number withId:(NSString *)numberId intoTable:(NSString *)tableName;

- (void)putObject:(id)object withId:(NSString *)objectId intoTable:(NSString *)tableName;

與此對應(yīng)葬凳,有以下value為NSString, NSNumber, NSDictionary和NSArray的讀取接口:

- (NSString *)getStringById:(NSString *)stringId fromTable:(NSString *)tableName;

- (NSNumber *)getNumberById:(NSString *)numberId fromTable:(NSString *)tableName;

- (id)getObjectById:(NSString *)objectId fromTable:(NSString *)tableName;

刪除數(shù)據(jù)接口

YTKKeyValueStore提供了以下接口用于刪除數(shù)據(jù)绰垂。

// 清除數(shù)據(jù)表中所有數(shù)據(jù)

- (void)clearTable:(NSString *)tableName;

// 刪除指定key的數(shù)據(jù)

- (void)deleteObjectById:(NSString *)objectId fromTable:(NSString *)tableName;

// 批量刪除一組key數(shù)組的數(shù)據(jù)

- (void)deleteObjectsByIdArray:(NSArray *)objectIdArray fromTable:(NSString *)tableName;

// 批量刪除所有帶指定前綴的數(shù)據(jù)

- (void)deleteObjectsByIdPrefix:(NSString *)objectIdPrefix fromTable:(NSString *)tableName;

更多接口

YTKKeyValueStore 還提供了以下接口來獲取表示內(nèi)部存儲的key-value對象。

// 獲得指定key的數(shù)據(jù)

- (YTKKeyValueItem *)getYTKKeyValueItemById:(NSString *)objectId fromTable:(NSString *)tableName;

// 獲得所有數(shù)據(jù)

- (NSArray *)getAllItemsFromTable:(NSString *)tableName;

在項目中的實際使用

在薄荷中 BHGlobalStore.h 封裝了 YTKKeyValueStore

@property (nonatomic, strong) YTKKeyValueStore *store;

- (void)putGlobalObject:(id)object withId:(NSString *)objectId;

- (id)globalObjectById:(NSString *)objectId;

- (void)deleteGlobalObjectById:(NSString *)objectId;

- (void)clearGlobalObjects;

BHGlobalStore.m 實現(xiàn)

初始化就創(chuàng)建了一個數(shù)據(jù)庫 kDatabase 并且創(chuàng)建一個表 kGlobal火焰,其它功能就是封裝對這張表的操作劲装,用來保證app中只有這一個數(shù)據(jù)庫和表,方便管理昌简。

- (instancetype)init

{

self = [super init];

if ( self ) {

self.store = [[YTKKeyValueStore alloc] initDBWithName:kDatabase];

[self.store createTableWithName:kGlobal];

}

return self;

}

- (void)putGlobalObject:(id)object withId:(NSString *)objectId

{

[self.store putObject:object withId:objectId intoTable:kGlobal];

}

- (id)globalObjectById:(NSString *)objectId

{

return [self.store getObjectById:objectId fromTable:kGlobal];

}

- (void)deleteGlobalObjectById:(NSString *)objectId

{

[self.store deleteObjectById:objectId fromTable:kGlobal];

}

- (void)clearGlobalObjects

{

[self.store clearTable:kGlobal];

}

薄荷中使用Mantle處理Model層對象

@interface BHActiveModel : MTLModel

BINGO_RESP_SPORTS_COURSES_COURSE_ID_SPORTS_DAYS 又繼承了 BHActiveModel

存到表中

-(void)saveToDB:(BINGO_RESP_SPORTS_COURSES_COURSE_ID_SPORTS_DAYS *)x{

//將model轉(zhuǎn)為json對象

NSDictionary *dic = [MTLJSONAdapter JSONDictionaryFromModel:x];

[app.store putGlobalObject:dic withId:PXSportsCourseRecordKey];

}

從表中取出

NSDictionary * dict = [app.store globalObjectById:PXSportsCourseForCourseId(self.courseId)];

if(dict){

//將json轉(zhuǎn)為model

BINGO_SPORTS_DAYS_DETAIL * cache =[BINGO_SPORTS_DAYS_DETAIL fromDictionary:dict];

總結(jié)

1.使用非常的方便 不用去管表的列 類型了,存取就一句代碼占业。

3.因為存的是json,就算model改變或擴展江场,只需要改model其它業(yè)務(wù)代碼都不需要更改纺酸。

4.適合數(shù)據(jù)量不大的存儲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窖逗,一起剝皮案震驚了整個濱河市址否,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖佑附,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樊诺,死亡現(xiàn)場離奇詭異,居然都是意外死亡音同,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門权均,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顿膨,“玉大人,你說我怎么就攤上這事叽赊×滴郑” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵必指,是天一觀的道長囊咏。 經(jīng)常有香客問我,道長塔橡,這世上最難降的妖魔是什么梅割? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮葛家,結(jié)果婚禮上户辞,老公的妹妹穿的比我還像新娘。我一直安慰自己癞谒,他們只是感情好咆课,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扯俱,像睡著了一般书蚪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迅栅,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天殊校,我揣著相機與錄音,去河邊找鬼读存。 笑死为流,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的让簿。 我是一名探鬼主播敬察,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尔当!你這毒婦竟也來了莲祸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锐帜,沒想到半個月后田盈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡缴阎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年允瞧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛮拔。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡述暂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出建炫,到底是詐尸還是另有隱情贸典,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布踱卵,位于F島的核電站廊驼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惋砂。R本人自食惡果不足惜妒挎,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望西饵。 院中可真熱鬧酝掩,春花似錦、人聲如沸眷柔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驯嘱。三九已至镶苞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鞠评,已是汗流浹背茂蚓。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剃幌,地道東北人聋涨。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像负乡,于是被迫代替她去往敵國和親牍白。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉抖棘,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,679評論 0 9
  • 前言 還記得大學(xué)剛學(xué)數(shù)據(jù)庫那會兒茂腥,天真地以為世界上所有的存儲都需要用數(shù)據(jù)庫來做狸涌。后來畢業(yè)后,正值NOSQL流行础芍,那...
    幻世神碼閱讀 1,707評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470
  • 1.CoreData 1.1 CoreData概述 1)Core data 是數(shù)據(jù)持久存儲的最佳方式 2)Core...
    微春風(fēng)閱讀 3,798評論 0 10
  • 最近項目中用到本地數(shù)據(jù)庫存儲數(shù)據(jù)右蹦,將具體的實現(xiàn)記錄一下诊杆。 1.數(shù)據(jù)庫的創(chuàng)建,創(chuàng)建了一個單例文件何陆。.h文件代碼如下晨汹。...
    妃雪閱讀 1,477評論 0 2