2016年2月13日 星期六

iOS筆記:Core Data

Core Data

SQLite資料庫是預設作為Core data的儲存區.

一種以物件導向方式, 讓使用者跟資料庫(或者是其他永續性儲存器)互動的框架. 因此使用Core Data 只要將你App中的物件與資料庫中的表格相對應即可, 甚至不需要瞭解SQL.

Core Data Stack

enter image description here

Xcode:
第一個實體(Entity,即table)。點選下方的 “Add Entity”,在左邊欄的會出現新的 “Entity” 項目.

enter image description here

新增這個 Product entity 的屬性(Attirbutes),點選 Attributes 欄位下方的 “+” (或下方的 “Add Attribute” 也可以)即可新增。

enter image description here

再來要讓程式碼中可以使用這個 Entity,我們要建立一個 Product 類別,並且繼承 NSManagedObject。XCode 可以幫我們自動產生,在選單列中選擇 Editor > Create NSManagedObject Subclass…:

enter image description here

接下來就一連串的Next及Create, 最後就會產生下列的檔案. 而這四個檔案就是用來存取Core Data資料的關鍵檔案.

enter image description here

單箭頭跟雙箭頭的差異在於”Relationship”, 一對多 or 多對多的概念.
enter image description here

存取Core Data資料

第一步先import剛剛建立的.h跟.m 檔案.
存資料可以透過

[self.managedObjectContext save:nil];

要抓取資料時, 必須先建立fetch request, 再指定這個fetch request要從哪個entity取出資料.

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Album"];
    fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]];

    NSError *error = nil;
    NSArray *fetchedAlbums = [[PACoreDataHelper managedObjectContext] executeFetchRequest:fetchRequest error:&error];

刪除資料

[[self.photo managedObjectContext] deleteObject:self.photo];

Core Data error

當遇到底下的Error時, 解決辦法就是delete the app in iOS simulator and run it again.

returned error Error Domain=NSCocoaErrorDomain Code=134100 “The operation couldn’t be completed. (Cocoa error 134100.)” UserInfo=0x7fdc09663080 {metadata={ NSPersistenceFrameworkVersion = 519; NSStoreModelVersionHashes = { TODOITEM = <222b8d5c 4aad84a8 08eb331e 50cd9b02 ed5eed35 ee67488b 069ff634 799badb7>; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( “” ); NSStoreType = SQLite; NSStoreUUID = “26066907-B092-491B-BB89-BE8CC6B2B845”; “_NSAutoVacuumLevel” = 2; }, reason=The model used to open the store is incompatible with the one used to create the store} with userInfo dictionary {

NSFetchRequest

enter image description here

參考網址:
http://ikevin.tw/?p=541
http://useyourloaf.com/blog/uialertcontroller-changes-in-ios-8.html

沒有留言:

張貼留言