iOS-FMDB緩存自定義對(duì)象

前言

最近剛做完一個(gè)列表頁的數(shù)據(jù)緩存,我同時(shí)探討FMDB和CoreData兩種做法前痘,下面先說下FMDB的過程攀甚。

過程

FMDB框架導(dǎo)入比較簡(jiǎn)單,上github看下就好馁启。
之前也有用過FMDB存儲(chǔ)驾孔,那時(shí)要存的數(shù)據(jù)比較簡(jiǎn)單,都是普通的字符串?dāng)?shù)據(jù)惯疙,但是這次要存的數(shù)據(jù)比較復(fù)雜翠勉,有自定義對(duì)象,還有數(shù)組螟碎,數(shù)組內(nèi)的還是自定義對(duì)象眉菱。下面主要說下這種做法:

下面是我要存儲(chǔ)的people對(duì)象

@interface People : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *age;
@property(nonatomic,strong)NSArray  *pets;//存Pet對(duì)象
@property(nonatomic,strong)Car *car;
@end

people對(duì)象里的Car對(duì)象

@interface Car : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *age;
@end

people對(duì)象中pets數(shù)組存儲(chǔ)的Pet對(duì)象

@interface Pet : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *age;
@end

以上就是我的數(shù)據(jù)結(jié)構(gòu)迹栓,下面說下怎么存儲(chǔ):
首先sqlite支持的存儲(chǔ)類型

NULL掉分,值是NULL
INTEGER俭缓,值是有符號(hào)整形,根據(jù)值的大小以1,2,3,4,6或8字節(jié)存放
REAL酥郭,值是浮點(diǎn)型值华坦,以8字節(jié)IEEE浮點(diǎn)數(shù)存放
TEXT,值是文本字符串不从,使用數(shù)據(jù)庫編碼(UTF-8惜姐,UTF-16BE或者UTF-16LE)存放
BLOB,二進(jìn)制數(shù)據(jù)(iOS的NSData)

一般存字符串都用text椿息,即使數(shù)字或者布爾值歹袁,也建議轉(zhuǎn)換成字符串統(tǒng)一存儲(chǔ)。

存儲(chǔ)自定義的對(duì)象關(guān)鍵就是要轉(zhuǎn)換成NSData類型并已BLOB類型存儲(chǔ)寝优。
此處需要用到歸檔和解檔

#import "Car.h"

@interface Car ()<NSCoding>

@end
@implementation Car
- (void)encodeWithCoder:(NSCoder *)encoder {
  [encoder encodeObject:self.name forKey:@"name"];
  [encoder encodeObject:self.age forKey:@"age"];
}
- (nullable instancetype)initWithCoder:(NSCoder *)decoder {
  self = [super init];
  if (self!=nil) {
    self.name = [decoder decodeObjectForKey:@"name"];
    self.age = [decoder decodeObjectForKey:@"age"];
  }
  return self;
}
@end

歸解檔參考這篇文章
自定義對(duì)象遵循NScoding協(xié)議条舔,并實(shí)現(xiàn)兩個(gè)方法:

-(void)encodeWithCoder:(NSCoder *)aCoder    //以keyValue形式對(duì)基本數(shù)據(jù)類型Encoding
-(id)initWithCoder:(NSCoder *)aDecoder //以keyValue形式對(duì)基本數(shù)據(jù)類型Decoding,返回?cái)?shù)據(jù)模型本身

當(dāng)然如果覺得實(shí)現(xiàn)這個(gè)協(xié)議比較麻煩乏矾,可以把對(duì)象先轉(zhuǎn)化成字典孟抗,再直接調(diào)用NSKeyedArchiver的archivedDataWithRootObject方法轉(zhuǎn)換成data,因?yàn)樵跀?shù)組和字典是默認(rèn)遵循NScoding協(xié)議钻心,可以直接歸檔和解檔凄硼。

創(chuàng)建表單

-(void)qunueCreatPeopleTable{
  
  NSString *creatTableString = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS People(people_name text, age text, pets blob, car blob)"];
    
  [_queue inDatabase:^(FMDatabase *db) {
    
    BOOL b = [db executeUpdate:creatTableString];
    
    NSLog(@"create table is %d",b);
    
  }];
  
}

插入數(shù)據(jù)

-(void)qunueInsertPeople:(People *)people{
  
  //pets轉(zhuǎn)化data
  NSData *petsData = [NSKeyedArchiver archivedDataWithRootObject:people.pets];
  //car轉(zhuǎn)換data
  NSData *carData = [NSKeyedArchiver archivedDataWithRootObject:people.car];
  
  [_queue inDatabase:^(FMDatabase *db) {
    
    BOOL insert = [db executeUpdate:@"INSERT INTO People (people_name, age, pets, car) VALUES (?,?,?,?)",people.name,people.age,petsData,carData];
    
    if (insert) {
      NSLog(@"添加成員成功!捷沸!");
    }else{
      NSLog(@"添加成員失斕痢!痒给!");
    }
    
  }];

}

獲取數(shù)據(jù)

-(NSArray *)qunueGetPeople{
  __block NSMutableArray *dataArray = nil;

  NSString *sql = [NSString stringWithFormat:@"SELECT *FROM People"];
  
  [_queue inDatabase:^(FMDatabase *db) {
    dataArray = [NSMutableArray array];
    FMResultSet *result = [db executeQuery:sql];
    while ([result next]) {
      //從表單中獲取相應(yīng)字段的value
      
      People *people = [People new];
      people.name = [result stringForColumn:@"people_name"];
      people.age = [result stringForColumn:@"age"];
      //pets
      NSData *petData = [result dataForColumn:@"pets"];
      NSArray * arr  = [NSKeyedUnarchiver unarchiveObjectWithData:petData];
      //car
      NSData *carData = [result dataForColumn:@"car"];
      Car *car = [NSKeyedUnarchiver unarchiveObjectWithData:carData];
      
      people.car = car;
      people.pets = arr;
      
      [dataArray addObject:people];
    }
  }];
  
  return dataArray;
  
}

還有一點(diǎn)十分重要坯钦,自己在做這個(gè)功能時(shí),只要修改過表單結(jié)構(gòu)侈玄,都要?jiǎng)h掉原程序重新加載婉刀,不然會(huì)出現(xiàn)數(shù)據(jù)庫不能插入的情況。
最后給上我自己寫的demo

結(jié)束

學(xué)習(xí)之路序仙,與君共勉突颊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市潘悼,隨后出現(xiàn)的幾起案子律秃,更是在濱河造成了極大的恐慌,老刑警劉巖治唤,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棒动,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宾添,警方通過查閱死者的電腦和手機(jī)船惨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門柜裸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粱锐,你說我怎么就攤上這事疙挺。” “怎么了怜浅?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵铐然,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我恶座,道長(zhǎng)搀暑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任跨琳,我火速辦了婚禮险掀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湾宙。我一直安慰自己樟氢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布侠鳄。 她就那樣靜靜地躺著埠啃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伟恶。 梳的紋絲不亂的頭發(fā)上碴开,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音博秫,去河邊找鬼潦牛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挡育,可吹牛的內(nèi)容都是我干的巴碗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼即寒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼橡淆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起母赵,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤逸爵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凹嘲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體师倔,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年周蹭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趋艘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疲恢。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖致稀,靈堂內(nèi)的尸體忽然破棺而出冈闭,到底是詐尸還是另有隱情俱尼,我是刑警寧澤抖单,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站遇八,受9級(jí)特大地震影響矛绘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刃永,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一货矮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斯够,春花似錦囚玫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至束亏,卻和暖如春铃在,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碍遍。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工定铜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怕敬。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓揣炕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親东跪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祝沸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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