另一種
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類中户魏。以下是一些常用方法說明。
// 打開名為test.db的數(shù)據(jù)庫挪挤,如果該文件不存在叼丑,則創(chuàng)新一個新的。
YTKKeyValueStore *store = [[YTKKeyValueStore alloc] initDBWithName:@"test.db"];
YTKKeyValueStore *store = [[YTKKeyValueStore alloc] initDBWithName:@"test.db"];
NSString *tableName = @"user_table";
// 創(chuàng)建名為user_table的表扛门,如果已存在鸠信,則忽略該操作
[store createTableWithName:tableName];
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;
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];
}
1.使用非常的方便 不用去管表的列 類型了,存取就一句代碼占业。
3.因為存的是json,就算model改變或擴展江场,只需要改model其它業(yè)務(wù)代碼都不需要更改纺酸。
4.適合數(shù)據(jù)量不大的存儲