加載數據模型 在某些情況下,您不必編寫任何代碼來加載模型。如果您在OS X上使用基於文檔的應用程序,NSPersistentDocument將管理爲您找到並加載應用程序模型的任務。如果您使用Xcode創建使用核心數據的非文檔應用程序(適用於OS X或iOS),則應用程序委託包含用於檢索模型的代碼。模型的名稱(如用於將其存儲在磁盤上的文件名所表示的)在運行時不相關。一旦模型由Core Data加載,文件名就沒有意義,並且沒有用處,所以您可以隨意命名模型文件。
如果要加載自己的模型,有兩個機制可以使用:
您可以從特定URL加載的單一模式,採用實例方法initWithContentsOfURL :. 這是一般首選的技術。通常,應用程序具有單個模型,並且使用此方法可確保僅加載該模型。您還可以通過URL加載單個模型,然後使用modelByMergingModels將它們統一:在使用它們實例化協調器之前。
如果您有多個模型 - 特別是在模型表示相同模式的不同版本 - 的情況下 - 知道加載哪個模型是必不可少的(在運行時將具有相同實體的模型合併到一個集合中會導致命名衝突和錯誤)。如果要將模型存儲在應用程序包的外部,則此方法也很有用,因此需要通過文件系統URL引用它。
您可以使用類方法mergedModelFromBundles:從特定的包集合創建合併模型。 在模型分離不重要的情況下,這種方法可能非常有用 - 例如,您可能知道您的應用程序及其鏈接的框架都有您需要或希望加載的模型。類方法允許您輕鬆加載所有模型,而無需考慮名稱,或者放入專門的初始化代碼以確保找到所有模型。
訪問,並在運行時
NSManagedObjectModel *model = <#Get a model#>;
NSFetchRequest *requestTemplate = [[NSFetchRequest alloc] init];
NSEntityDescription *publicationEntity =
[[model entitiesByName] objectForKey:@"Publication"];
[requestTemplate setEntity:publicationEntity];
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:
@"(mainAuthor.firstName like[cd] $FIRST_NAME) AND \
(mainAuthor.lastName like[cd] $LAST_NAME) AND \
(publicationDate > $DATE)"];
[requestTemplate setPredicate:predicateTemplate];
[model setFetchRequestTemplate:requestTemplate
forName:@"PublicationsForAuthorSinceDate"];
使用被管理的對象模型使用讀取請求模板
NSManagedObjectModel *model = <#Get a model#>;
NSError *error = nil;
NSDictionary *substitutionDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"Fiona", @"FIRST_NAME", @"Verde", @"LAST_NAME",
[NSDate dateWithTimeIntervalSinceNow:-31356000], @"DATE", nil];
NSFetchRequest *fetchRequest =
[model fetchRequestFromTemplateWithName:@"PublicationsForAuthorSinceDate"
substitutionVariables:substitutionDictionary];
NSArray *results =
[aManagedObjectContext executeFetchRequest:fetchRequest error:&error];
謝謝你......我一直在尋找它整天。但是認真的蘋果,對於核心數據和一般的ios來說,太多的樣板文件不得不寫。 – user1297061