勤の時-データの耐久層の実現

4960 ワード

アプリは早くオンラインになりました.ダウンロードして使ってください.http://itunes.apple.com/app/id1206687109 ソースはすでに公開されていますので、みんなで行ってもいいです.https://github.com/Inspirelife96/ILDiligenceダウンロードします好きならForkかスターをください.ありがとうございます.以下はこの一連の全部の招待状です.考え方と原型勤務の時-アーキテクチャと工事組織の結構勤の時-データの恒久層の勤務を実現する時-ネットの層の勤務を実現する時-業務の論理層勤の時-Info.plistの変更勤務の時-レイヤーを表します.勤の時-表示層(五)
データの耐久層の設計については、まずおかみさんの文章iOS応用アーキテクチャを紹介します.
私達は少しずつ見て、まず需要によって恒久化案を決めます.その需要は何ですか?【勤の時】タスクリストがあります.各タスクには自分の配置があります.もう一つ重要なのは、タスクの実行状況の統計分析です.これはタスクを実行するたびに記録が必要ということです.また、毎日の写真を共有しています.この写真と画像の紹介は毎日ネットからダウンロードしています.ネットがない場合は、前回の写真と内容を使います.
耐久層需要.png
以上より、3つの持久化が必要な内容となります.
  • タスクリストおよびその構成は、データベーステーブル構造でタスク(Task Data Table)を記述する場合、以下の通りである.
    フィールド名
    属性
    説明
    id
    ストリングス
    タスクID、メインキー、数字の種類もあります.
    name
    ストリングス
    ジョブ名
    カラー
    ストリングス
    タスクの色
    diligence Time
    number
    集中時間が長い
    isest Mode
    ブック
    休憩モードかどうか
    レスト・タイム
    number
    休憩時間が長いです
    isFocus Mode
    ブック
    没頭モードですか?
    music Name
    ストリングス
    背景音楽
    isMusic Enbled
    ブック
    背景音楽を開くかどうか
    isAlert Enbaled
    ブック
    タスクリマインダを開くかどうか
    alertTime
    ダテ
    タスクリマインダ時間
  • タスクリストおよびその構成は、データベーステーブル構造で1つのフォーカス(Diligence Data Table)を記述するなら、以下の通りである.
    フィールド名
    属性
    説明
    id
    ストリングス
    タスクID、外部キー、Task Data TableのIDと関連付けられています.
    startDate
    ダテ
    集中開始時間
    endDate
    ダテ
    集中終了時間
    break Times
    number
    中断回数
    diligence Time
    number
    集中時間が長い
  • 毎日の写真と物語は、データベーステーブル構造で表すと、次のようになります.
  • フィールド名
    属性
    説明
    dateToday
    ダテ
    キー、日付
    title
    ストリングス
    説明
    atribute
    ストリングス
    ソース
    para 1
    ストリングス
    今日の背景図の物語
    イメージ
    ダタ
    集中時間が長い
    どんなプランがありますか
    次の内容は大神の文章から抜粋して、持続化の需要がある時、私達は非常に多い方案があります.NSUserDefault、KeyCharin、File、及びデータベースに基づく無数のサブソリューションがあります.したがって、持続化が必要な需要があるときは、まず何を利用して持続化するべきかを考えます.
  • NSUserDefaultは、一般的に、小規模のデータ、弱業務に関するデータは、NSUserDefaultに入れられます.内容が多いデータは、強業務に関するデータはNSUserDefaultにはあまり適していません.
  • keychain Keychainは、アップルが提供する可逆暗号化を備えた記憶メカニズムであり、一般的には様々な保存パスワードの需要に利用されている.また、アプリがアンインストールされているので、システムが再インストールされない限り、Keychainのデータは保留されています.また、iCloudに同期されてもいいという特性もあります.みんなはここにユーザー固有のマーク列を保存します.したがって、暗号化が必要で、iCloudを保存したい敏感なデータがあります.
  • ファイル格納ファイルには、Plist、archive、Streamなどが含まれており、一般的な構造化されたデータや問い合わせに便利なデータは、いずれもPlistとして永続化される.Archive方式は、通常はあまり使われていないが、大量のデータを記憶したり、読み取った後に直接対象化したいデータを格納するのに適しています.Archiveは対象とその対象との関係を逐次化していますので、データを読み込むにはDecodeが時間がかかります.Decodeの過程はストレス解消にもなり、対象化にもなります.これは具体的な実現によって決められます.Streamは一般的なファイルを保存しています.写真を保存するなど、よく使うのに適していますが、データ量はそんなに大きくないです.
  • データベース格納データベースなら、より多くの種類があります.アップルはCore Dataを持っています.もちろん業界でも多くの代替案がありますが、iOSではCore Data以外にFMBBが多く使われています.データベースの方案は主に添削して調べるためで、データが状態と分類がある時はやはりデータベースの方案を採用したほうがいいです.特にこれらの状態と種類が強い業務に関連している時は、データベースの方案を採用しなければなりません.ファイルシステムを通してファイルを巡回することができないからです.取得する必要がある状態やカテゴリに属するデータを識別するには、コストがかかりすぎます.もちろん、特に大量のデータも直接データベースを格納するのに適していません.たとえば、写真や文章のようなデータは、一般的にはデータベースにファイル名を保存しています.そして、このファイル名はある画像や文章のファイルを指しています.もし本当に全文の索引のこのような需要をするならば、やはりAPIを掛かってサービスの端までなくしてする方がいいと提案しています.
  • 需要から見ると、需要の1、2は2枚の表を削除して調べる必要があります.ルールは複雑ではなく、データ量も大きくないし、暗号化も必要ではないので、ここではファイルで保存して、Plistの方式で長期化します.Task Data Tableは辞書形式でDockフォルダの下のtask Data.plistに格納されています.Diligence Data Tableは辞書形式でDockフォルダに格納されているdiligence Data.plistです.
    需要3は最近の結果を残しておくだけですが、中に写真データがあります.彼が持っていて、しかも一つの画像データがありますので、ここでPlistファイルを引き続き使用して、Dockmentフォルダの下のstoryData.plistに保存します.
    データベース形式の耐久層とは異なり、Plistはここでは読み取りと保存の機能のみを提供しています.その他の例は増加して、削除して、改正の機能、業務の論理の階まで移動して実現しました.
    最終コードは、ILD Taskdata Persistenceを例にとって、他のILD PersistencLayerプロジェクトを参照してください.https://github.com/Inspirelife96/ILDiligence)
    ILD Task Data Persistenceクラス
    //  ILDTaskDataPersistence.h
    
    
    #import 
    
    @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