06 CTPersistance

這個(gè)庫(kù)是在Casa老師在[《OS應(yīng)用架構(gòu)談 本地持久化方案及動(dòng)態(tài)部署》]這篇文章(http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html)里給出一個(gè)持久化方案的實(shí)現(xiàn)娄涩,比起Key Value的簡(jiǎn)單存儲(chǔ)翅帜,這個(gè)庫(kù)基于SQLite惭每,提供了對(duì)弱業(yè)務(wù)(數(shù)據(jù)操作)封裝,非常適用于有狀態(tài)的數(shù)據(jù)持久化。我上個(gè)月調(diào)查了幾種key value的持久化方式烦味,也再次看了這個(gè)方案苍凛。對(duì)我們只需要key-value存儲(chǔ)的應(yīng)用來(lái)說(shuō),這個(gè)持久化方案顯得重型了一點(diǎn)粮彤。我也是草草看了兩遍源碼根穷,沒(méi)有具體整理。最有效的學(xué)習(xí)方式還是使用并修改源碼导坟。

對(duì)這個(gè)方案里的屿良,強(qiáng)業(yè)務(wù)弱業(yè)務(wù)的分離,數(shù)據(jù)表達(dá)和數(shù)據(jù)操作的分離有點(diǎn)明白惫周,但是沒(méi)在項(xiàng)目里用上尘惧,也就沒(méi)有什么特別的心得。以后應(yīng)該還會(huì)回到這里递递,接下來(lái)會(huì)把精力方案單元測(cè)試和網(wǎng)絡(luò)的項(xiàng)目?jī)?nèi)容喷橙。

我覺(jué)得作者Tian Wei Yu (AKA: Casa Taloyum),是我的榜樣登舞。技術(shù)好贰逾,文章寫得也好,還非常熱心逊躁,基本上是有問(wèn)必答似踱,他的博客上有常常的回復(fù)列表。在這浮躁的技術(shù)界實(shí)在是少見(jiàn)稽煤。我通讀了他iOS應(yīng)用架構(gòu)談的幾篇文章核芽,受益匪淺,值得好好研究酵熙。

問(wèn)題

1)CTPersistanceTable的 isFromMigration屬性怎么使用轧简,數(shù)據(jù)庫(kù)遷移的時(shí)候要注意些什么?

2)CTPersistanceQueryCommand.m line 72 如果傳進(jìn)來(lái)的error為nil匾二,函數(shù)調(diào)用失敗返回YES哮独,而不是NO

總結(jié)

1)版本遷移的步驟
在創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象時(shí),判斷是否需要遷移察藐,并執(zhí)行遷移皮璧。具體是在 CTPersistanceDataBase 類的 - (instancetype)initWithDatabaseName:(NSString *)databaseName error:(NSError *__autoreleasing *)error 方法。

數(shù)據(jù)庫(kù)中有一張叫做 CTPersistanceVersionTable的表分飞,記錄當(dāng)前的數(shù)據(jù)庫(kù)版本悴务。表只有2個(gè)字段,一條記錄。如果表中無(wú)記錄讯檐,用 CTPersistanceMigrator的 migrationVersionList第一條記錄初始化它羡疗。
+ (NSDictionary *)columnInfo{ return @{ @"identifier":@"INTEGER PRIMARY KEY AUTOINCREMENT", @"databaseVersion":@"TEXT" }; }

一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)Migrator,Migrator的migrationVersionList别洪,記錄數(shù)據(jù)庫(kù)的遷移的所有版本叨恨。每個(gè)版本對(duì)應(yīng)一個(gè)遵守 CTPersistanceMigrationStep協(xié)議的MigrationStep類,這個(gè)類里提供了對(duì)應(yīng)版本的向上和向下遷移的方法挖垛。

@implementation TestMigrator#pragma mark - CTPersistanceMigratorProtocol- (NSDictionary *)migrationStepDictionary{ return @{ @"1.0":[MigrationStep1_0 class], @"2.0":[MigrationStep2_0 class] };}

- (NSArray *)migrationVersionList{ return @[kCTPersistanceInitVersion, @"1.0", @"2.0"]; } @end

@implementation MigrationStep1_0- (void)goUpWithQueryCommand:(CTPersistanceQueryCommand *)queryCommand error:(NSError *__autoreleasing *)error{ TestTable *testTable = [[TestTable alloc] initWithQueryCommand:queryCommand]; [[queryCommand addColumn:@"migration1_0" columnInfo:@"TEXT" tableName:testTable.tableName] executeWithError:error]; [testTable findWithPrimaryKey:@(1) error:NULL]; }

- (void)goDownWithQueryCommand:(CTPersistanceQueryCommand *)queryCommand error:(NSError *__autoreleasing *)error { } @end

知識(shí)點(diǎn)

1)
#define NSDictionaryOfVariableBindings(...)

_NSDictionaryOfVariableBindings(@"" # __VA_ARGS__, __VA_ARGS__, nil)
UIKIT_EXTERN NSDictionary *_NSDictionaryOfVariableBindings(NSString *commaSeparatedKeysString, __nullable id firstValue, ...) NS_AVAILABLE_IOS(6_0); // not for direct use

NSString *name = @"wenjing";
NSNumber *age = @31; NSDictionary *dic = NSDictionaryOfVariableBindings(name, age);

(lldb) po dic { age = 31; name = wenjing; }

nice code sample

1)簡(jiǎn)單的線程間同步機(jī)制(性能應(yīng)該不高痒钝,特別是,不能在主線程中執(zhí)行)

- (void)performAsyncAction:(void (^)(void))action shouldWaitUntilDone:(BOOL)shouldWaitUntilDone { __block volatile BOOL shouldWait = shouldWaitUntilDone; NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ action(); shouldWait = NO; }]; [self.operationQueue addOperation:operation]; while (shouldWait) { } }

2)sqlite C語(yǔ)言接口使用范例

3)讓類遵守協(xié)議晕换,而不在基類里使用空方法
@interface CTPersistanceTable ()@property (nonatomic, weak) id<CTPersistanceTableProtocol> child;@property (nonatomic, strong, readwrite) CTPersistanceQueryCommand *queryCommand;
@end
這里為什么要一個(gè)child午乓,而不是直接使用self?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闸准,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梢灭,更是在濱河造成了極大的恐慌夷家,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敏释,死亡現(xiàn)場(chǎng)離奇詭異库快,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钥顽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門义屏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蜂大,你說(shuō)我怎么就攤上這事闽铐。” “怎么了奶浦?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵兄墅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我澳叉,道長(zhǎng)隙咸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任成洗,我火速辦了婚禮五督,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓶殃。我一直安慰自己充包,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布碌燕。 她就那樣靜靜地躺著误证,像睡著了一般继薛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愈捅,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天遏考,我揣著相機(jī)與錄音,去河邊找鬼蓝谨。 笑死灌具,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的譬巫。 我是一名探鬼主播咖楣,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芦昔!你這毒婦竟也來(lái)了诱贿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咕缎,失蹤者是張志新(化名)和其女友劉穎珠十,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凭豪,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焙蹭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫂伞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孔厉。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖帖努,靈堂內(nèi)的尸體忽然破棺而出撰豺,到底是詐尸還是另有隱情,我是刑警寧澤然磷,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布郑趁,位于F島的核電站,受9級(jí)特大地震影響姿搜,放射性物質(zhì)發(fā)生泄漏寡润。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一舅柜、第九天 我趴在偏房一處隱蔽的房頂上張望梭纹。 院中可真熱鬧,春花似錦致份、人聲如沸变抽。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绍载。三九已至诡宗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間击儡,已是汗流浹背塔沃。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阳谍,地道東北人蛀柴。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矫夯,于是被迫代替她去往敵國(guó)和親鸽疾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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