iOS資料持久化儲存-CoreData

windtersharp發表於2018-04-04

1.App沙盒相關型別檔案

sqlite:資料庫檔案,儲存資料
sqlite-shm,sqlite-wal是iOS7之後系統會預設開啟一個新的“資料庫日誌記錄模式”(database journaling mode)生成的。在除錯的時候,我們需要即時的觀察資料庫的變化,我們就可以先禁用這個日誌記錄模式,只需要在建立持久化儲存區的時候存入一個options引數即可。

NSDictionary *options = @{NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"}};

sqlite-shm:共享記憶體(Shared Memory)檔案,該檔案裡面會包含一份sqlite-wal檔案的索引,系統會自動生成shm檔案,刪除它,下次執行還會自動生成
sqlite-wal:預寫式日誌(Write-Ahead Log)檔案,這個檔案裡面會包含尚未提交的資料庫事務,所以看見有這個檔案了,就代表資料庫裡面還有沒處理完的事務需要提交,所以說如果有sqlite-wal檔案,再去開啟sqlite檔案,很可能最近一次資料庫操作還沒有執行

2.表的欄位

  • Z_PK:是表的主鍵,從1開始遞增,唯一值。
  • Z_ENT:表在xcdatamodel中的索引值,建立了5個表,Z_ENT的區間就是[1,5]。
  • Z_OPT:表示的是每條資料被操作的次數,初始化值為1,只要是增刪改查都會加1。

3.輕量級遷移

只需要在建立持久化儲存區的時候存入一個options引數即可。

NSDictionary *options = @{NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"},
                              NSMigratePersistentStoresAutomaticallyOption :@YES,
                              NSInferMappingModelAutomaticallyOption:@YES
                              };

輕量級的遷移:
實體:可以新增實體,可以刪除實體,實體名字修改(需將重新命名後實體的Renaming ID,設定為之前的實體名)。
實體欄位:修改實體的欄位(否則舊欄位對應的資料會被清除,其它的欄位資料不受影響,)。

  • 為Entity簡單的新增一個屬性
  • 為Entity移除一個屬性
  • 屬性值由 Optional Non-optional 之間轉換
  • 為屬性設定 Default Value
  • 重新命名Entity或者Attribute
  • 增加一個新的relationship 或者刪除一個已經存在的 relationship
  • 重新命名relationship
  • 改變relationship to-one to-many 等
  • 增加,刪除Entities
  • 增加新的 Parent 或者 Child Entity
  • 從Hierarchy中移除Entities

相關文章