勤之時 - 數(shù)據(jù)持久層的實現(xiàn)

應(yīng)用很早就上線了,歡迎大家下載使用:http://itunes.apple.com/app/id1206687109
源碼已經(jīng)公開抚垃,大家可以去https://github.com/Inspirelife96/ILDiligence下載春哨。 喜歡的話Fork或者給個Star荆隘,非常感謝。
下面是這一系列的全部帖子:
想法和原型
勤之時 - 架構(gòu)與工程組織結(jié)構(gòu)
勤之時 - 數(shù)據(jù)持久層的實現(xiàn)
勤之時 - 網(wǎng)絡(luò)層的實現(xiàn)
勤之時 - 業(yè)務(wù)邏輯層
勤之時 - Info.plist的改動
勤之時 - 表示層(一)
勤之時 - 表示層(二)
勤之時 - 表示層(三)
勤之時 - 表示層(四)
勤之時 - 表示層(五)

關(guān)于數(shù)據(jù)持久層的設(shè)計悲靴,首先推薦一篇大神的文章iOS應(yīng)用架構(gòu)談 本地持久化方案及動態(tài)部署

我們一點點來看, 首先根據(jù)需求決定持久化方案
那么需求是什么臭胜?
【勤之時】有一個任務(wù)列表,每個任務(wù)有自己的一些配置癞尚,并可以增耸三,刪任務(wù),和修改任務(wù)配置浇揩。另外一個比較重要的是仪壮,任務(wù)執(zhí)行狀況的統(tǒng)計分析,這意味著每次執(zhí)行任務(wù)時胳徽,需要記錄下來积锅。此外爽彤,還有每日圖片分享,這個圖片以及圖片介紹是每日從網(wǎng)上下載的缚陷,若沒有網(wǎng)絡(luò)的情況下适篙,則用前一次的圖片及內(nèi)容。

持久層需求.png

綜上所述箫爷,有3個需要持久化的內(nèi)容

  • 任務(wù)列表及其配置嚷节, 若以數(shù)據(jù)庫表結(jié)構(gòu)來描述一個任務(wù)(Task Data Table),如下 )(需要增虎锚,刪硫痰,改,查)
字段名 屬性 描述
id string 任務(wù)ID窜护,主鍵效斑,也可以為數(shù)字類型
name string 任務(wù)名字
color string 任務(wù)配色
diligenceTime number 專注時長
isRestMode bool 是否為休息模式
restTime number 休息時長
isFocusMode bool 是否為沉浸模式
musicName string 背景音樂
isMusicEnabled bool 背景音樂是否打開
isAlertEnabled bool 是否打開任務(wù)提醒
alertTime date 任務(wù)提醒時間
  • 任務(wù)列表及其配置, 若以數(shù)據(jù)庫表結(jié)構(gòu)來描述一個專注(Diligence Data Table)柱徙,如下 (需要增缓屠,刪,查)
字段名 屬性 描述
id string 任務(wù)ID坐搔,外鍵藏研,與Task Data Table 的id關(guān)聯(lián)
startDate date 專注開始時間
endDate date 專注結(jié)束時間
breakTimes number 中斷次數(shù)
diligenceTime number 專注時長
  • 每日圖片及故事, 若以數(shù)據(jù)庫表結(jié)構(gòu)來表述 (Todays Story)概行,如下蠢挡,(僅需保留最近一次的值即可)。
字段名 屬性 描述
dateToday date 主鍵凳忙,日期
title string 描述
attribute string 來源
para1 string 今日背景圖故事
image data 專注時長

有哪些方案业踏?

下面內(nèi)容摘抄自大神的文章
在有需要持久化需求的時候,我們有非常多的方案可供選擇:NSUserDefault涧卵、KeyChain勤家、File,以及基于數(shù)據(jù)庫的無數(shù)子方案柳恐。因此伐脖,當(dāng)有需要持久化的需求的時候,我們首先考慮的是應(yīng)該采用什么手段去進行持久化乐设。

  • NSUserDefault
    一般來說讼庇,小規(guī)模數(shù)據(jù),弱業(yè)務(wù)相關(guān)數(shù)據(jù)近尚,都可以放到NSUserDefault里面蠕啄,內(nèi)容比較多的數(shù)據(jù),強業(yè)務(wù)相關(guān)的數(shù)據(jù)就不太適合NSUserDefault了。
  • keychain
    Keychain是蘋果提供的帶有可逆加密的存儲機制歼跟,普遍用在各種存密碼的需求上和媳。另外,由于App卸載只要系統(tǒng)不重裝哈街,Keychain中的數(shù)據(jù)依舊能夠得到保留留瞳,以及可被iCloud同步的特性,大家都會在這里存儲用戶唯一標識串叹卷。所以有需要加密撼港、需要存iCloud的敏感小數(shù)據(jù),一般都會放在Keychain骤竹。
  • 文件存儲
    文件存儲包括了Plist、archive往毡、Stream等方式蒙揣,一般結(jié)構(gòu)化的數(shù)據(jù)或者需要方便查詢的數(shù)據(jù),都會以Plist的方式去持久化开瞭。Archive方式適合存儲平時不太經(jīng)常使用但很大量的數(shù)據(jù)懒震,或者讀取之后希望直接對象化的數(shù)據(jù),因為Archive會將對象及其對象關(guān)系序列化嗤详,以至于讀取數(shù)據(jù)的時候需要Decode很花時間个扰,Decode的過程可以是解壓,也可以是對象化葱色,這個可以根據(jù)具體<NSCoding>中的實現(xiàn)來決定递宅。Stream就是一般的文件存儲了,一般用來存存圖片啊啥的苍狰,適用于比較經(jīng)常使用办龄,然而數(shù)據(jù)量又不算非常大的那種。
  • 數(shù)據(jù)庫存儲
    數(shù)據(jù)庫存儲的話淋昭,花樣就比較多了俐填。蘋果自帶了一個Core Data,當(dāng)然業(yè)界也有無數(shù)替代方案可選翔忽,不過真正用在iOS領(lǐng)域的除了Core Data外英融,就是FMDB比較多了。數(shù)據(jù)庫方案主要是為了便于增刪改查歇式,當(dāng)數(shù)據(jù)有狀態(tài)和類別的時候最好還是采用數(shù)據(jù)庫方案比較好驶悟,而且尤其是當(dāng)這些狀態(tài)和類別都是強業(yè)務(wù)相關(guān)的時候,就更加要采用數(shù)據(jù)庫方案了贬丛。因為你不可能通過文件系統(tǒng)遍歷文件去甄別你需要獲取的屬于某個狀態(tài)或類別的數(shù)據(jù)撩银,這么做成本就太大了。當(dāng)然豺憔,特別大量的數(shù)據(jù)也不適合直接存儲數(shù)據(jù)庫额获,比如圖片或者文章這樣的數(shù)據(jù)够庙,一般來說,都是數(shù)據(jù)庫存一個文件名抄邀,然后這個文件名指向的是某個圖片或者文章的文件耘眨。如果真的要做全文索引這種需求,建議最好還是掛個API丟到服務(wù)端去做境肾。

從需求上看剔难,需求1,2需要對兩張表進行增刪改查奥喻,而且規(guī)則并不復(fù)雜偶宫,數(shù)據(jù)量也不會很大,且并不需要加密环鲤,所以這里考慮用文件存儲纯趋,以Plist的方式去持久化。
Task Data Table 以 字典的形式 (task id -> task data dictionary)存儲在Document文件夾下的taskData.plist冷离。
Diligence Data Table 以字典的形式 (task id -> diligence data dictionary)存儲在Document文件夾下的diligenceData.plist吵冒。

需求3僅需要保留最近一次的結(jié)果,但里面有一個圖片數(shù)據(jù)西剥,鑒于他有且僅有一個圖片數(shù)據(jù)痹栖,這里還是繼續(xù)使用Plist文件,存儲在Document文件夾下的storyData.plist瞭空。

和數(shù)據(jù)庫形式的持久層不同揪阿,Plist這里僅提供了讀取和保存的功能。其他的例如增匙铡,刪图甜,改的功能,上移到業(yè)務(wù)邏輯層去實現(xiàn)了鳖眼。

最終代碼, 以ILDTaskDataPersistence為例黑毅,其他的請參考Github里的ILDPersistenceLayer工程(https://github.com/Inspirelife96/ILDiligence)

ILDTaskDataPersistence Class

//  ILDTaskDataPersistence.h


#import <Foundation/Foundation.h>

@interface ILDTaskDataPersistence : NSObject

+ (NSDictionary *)readTaskData;
+ (void)saveTaskData:(NSDictionary *)taskDataNSDictionary;

@end
//  ILDTaskDataPersistence.m


#import "ILDTaskDataPersistence.h"
#import "ILDPersistenceFilePathHelper.h"

NSString *const kTaskDataPersistanceFile = @"taskData.plist";

@implementation ILDTaskDataPersistence

+ (NSDictionary *)readTaskData {
    NSString *taskDataFilePath = [ILDPersistenceFilePathHelper persistenceFilePath:kTaskDataPersistanceFile];
    NSDictionary *taskDataDictionary = [NSDictionary dictionaryWithContentsOfFile:taskDataFilePath];
    if (!taskDataDictionary) {
        NSString *defaultTaskDataFilePath = [[NSBundle mainBundle] pathForResource:kTaskDataPersistanceFile ofType:nil];
        taskDataDictionary = [NSDictionary dictionaryWithContentsOfFile:defaultTaskDataFilePath];
        [ILDTaskDataPersistence saveTaskData:taskDataDictionary];
    }
    
    return taskDataDictionary;
}

+ (void)saveTaskData:(NSDictionary *)taskDataNSDictionary {
    NSString *taskDataFilePath = [ILDPersistenceFilePathHelper persistenceFilePath:kTaskDataPersistanceFile];
    [taskDataNSDictionary writeToFile:taskDataFilePath atomically:YES];
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钦讳,隨后出現(xiàn)的幾起案子矿瘦,更是在濱河造成了極大的恐慌,老刑警劉巖愿卒,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缚去,死亡現(xiàn)場離奇詭異,居然都是意外死亡琼开,警方通過查閱死者的電腦和手機易结,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搞动,你說我怎么就攤上這事躏精。” “怎么了鹦肿?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵矗烛,是天一觀的道長。 經(jīng)常有香客問我箩溃,道長瞭吃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任涣旨,我火速辦了婚禮歪架,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘开泽。我一直安慰自己牡拇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布穆律。 她就那樣靜靜地躺著,像睡著了一般导俘。 火紅的嫁衣襯著肌膚如雪峦耘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天旅薄,我揣著相機與錄音辅髓,去河邊找鬼。 笑死少梁,一個胖子當(dāng)著我的面吹牛洛口,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凯沪,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼第焰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妨马?” 一聲冷哼從身側(cè)響起挺举,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烘跺,沒想到半個月后湘纵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡滤淳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年梧喷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡铺敌,死狀恐怖汇歹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情适刀,我是刑警寧澤秤朗,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站笔喉,受9級特大地震影響取视,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜常挚,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一作谭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奄毡,春花似錦折欠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盗忱,卻和暖如春酱床,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趟佃。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工扇谣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闲昭。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓罐寨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親序矩。 傳聞我的和親對象是個殘疾皇子鸯绿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

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