2013-02-05 18 views
5

Ich habe diese Stanford Tutorials https://itunes.apple.com/us/course/ipad-iphone-app-development/id495052415 gefunden, und habe eine Vorlesung über Kerndaten gehört, die wirklich großartig ist.UIManagedDocument und Core Data

Es zeigt, wie Core-Daten über UIManagedDocument zugreifen ... Nur was ich nicht verstehe, wie weiß, welches Modell sollte es verwenden, weil ich es nirgends gesetzt sehe?

Um es zusammenzufassen, wenn Sie UIManagedDocument verwenden, wie definieren Sie das Datenbankmodell, das verwendet wird?

Antwort

6

holen Verwendung fand ich die Antwort:

'UIManagedDocument' alle Takes die Modelle aus dem Hauptpaket Ihrer Anwendung und macht die Vereinigung von diesen Modelle. Wenn Sie nur ein Modell haben, wird dieses Modell verwendet.

Dies kann durch Überschreiben der Klasse 'UIManagedDocument' geändert werden.

+0

danke ... Ich habe gesucht es den ganzen Tag. aber im Ernst, Apple, für Core-Daten und IOS im Allgemeinen gibt es einfach zu viel Stoff schreiben müssen. – user1297061

1

Laden eines Datenmodells In einigen Fällen müssen Sie keinen Code zum Laden eines Modells schreiben. Wenn Sie eine dokumentbasierte Anwendung unter OS X verwenden, verwaltet NSPersistentDocument die Aufgabe, das Modell Ihrer Anwendung für Sie zu finden und zu laden. Wenn Sie Xcode zum Erstellen einer Nicht-Dokumentanwendung verwenden, die Core Data (für OS X oder für iOS) verwendet, enthält der Anwendungsdelegate Code zum Abrufen des Modells. Der Name eines Modells - dargestellt durch den Dateinamen, der zum Speichern auf der Festplatte verwendet wird - ist zur Laufzeit nicht relevant. Sobald das Modell von Core Data geladen wurde, ist der Dateiname bedeutungslos und hat keine Verwendung, so dass Sie die Modelldatei beliebig benennen können.

Wenn Sie ein Modell laden möchten selbst gibt es zwei Mechanismen können Sie:

Sie können von einer bestimmten URL ein einziges Modell laden, um die Instanz-Methode initWithContentsOfURL mit :. Dies ist die allgemein bevorzugte Technik. In der Regel verfügt eine Anwendung über ein einzelnes Modell. Mit dieser Methode stellen Sie sicher, dass Sie nur dieses Modell laden. Sie können auch einzelne Modelle über URLs laden und sie dann mithilfe von modelByMergingModels vereinheitlichen: bevor Sie einen Koordinator mit ihnen instanziieren. In Fällen, in denen Sie mehr als ein Modell haben - insbesondere in Fällen, in denen die Modelle verschiedene Versionen desselben Schemas darstellen - ist es wichtig zu wissen, welches Modell geladen werden soll (Modelle zur Laufzeit mit denselben Entitäten zusammenführen) würde Namenskollisionen und Fehler verursachen). Diese Methode ist auch nützlich, wenn Sie das Modell außerhalb des Bundles für Ihre Anwendung speichern möchten und es daher über eine Dateisystem-URL referenzieren muss.

Sie können ein zusammengeführtes Modell aus einer bestimmten Sammlung von Bundles mithilfe der Klassenmethode mergedModelFromBundles: erstellen. Diese Methode kann in Fällen nützlich sein, in denen die Segregation von Modellen nicht wichtig ist. Beispielsweise kennen Sie Ihre Anwendung und ein Framework, das mit Modellen verknüpft ist, die Sie benötigen oder laden möchten. Mit der Klassenmethode können Sie problemlos alle Modelle gleichzeitig laden, ohne sich Gedanken über die Namen machen zu müssen, oder einen speziellen Initialisierungscode eingeben, um sicherzustellen, dass alle Ihre Modelle gefunden werden.

Zugriff und die Verwendung eines Managed Object Model zur Laufzeit

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"]; 

eine Anfrage Vorlage

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]; 
+0

Ich glaube nicht, dass Sie die Frage ganz verstanden haben, oder ich habe zumindest Ihre Antwort nicht verstanden ... Ich gebe Ihnen die Stimme für den Versuch ... – MegaManX