Ich möchte einem vorhandenen iPhone-Projekt Kerndaten hinzufügen, erhalte jedoch immer noch viele Kompilierungsfehler:
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before 'NSManagedObjectModel'
- ...
Ich habe das Core Data Framework bereits zum Ziel hinzugefügt (Rechtsklick auf mein Projekt unter "Ziele", "Hinzufügen" - "Vorhandene Frameworks", "CoreData.framework").
Meine Header-Datei:
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
[...]
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
Was vermisse ich? Das Starten eines neuen Projekts ist keine Option ...
Vielen Dank!
edit
sorry, ich habe diese Implementierungen ... aber es scheint, dass die Bibliothek fehlt ... die Implementierungsmethoden sind voll mit Kompilierungsfehlern wie " managedObjectContext undeclared
", " NSPersistentStoreCoordinator undeclared
", aber auch mit "Expected ')' before NSManagedObjectContext
" (obwohl es scheint wie die Klammern richtig sind) ...
#pragma mark -
#pragma mark Core Data stack
/**
Returns the managed object context for the application.
If the context doesn't already exist, it is created and bound to the persistent store
coordinator for the application.
*/
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
/**
Returns the managed object model for the application.
If the model doesn't already exist, it is created by merging all of the models found in
application bundle.
*/
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
/**
Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"Core_Data.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeUrl options:nil error:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should
not use this function in a shipping application, although it may be useful during
development. If it is not possible to recover from the error, display an alert panel that
instructs the user to quit the application by pressing the Home button.
Typical reasons for an error here include:
* The persistent store is not accessible
* The schema for the persistent store is incompatible with current managed object
model
Check the error message to determine what the actual problem was.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
Nur um alle Schritte zu erläutern, die Sie tatsächlich ausführen müssen, um einem Projekt, das es zuvor nicht hatte, Kerndaten hinzuzufügen:
Schritt 1: Fügen Sie das Framework hinzu
Klicken Sie auf Ihr App-Ziel (im linken Bereich befindet sich das obere Symbol mit dem Namen Ihrer App), gehen Sie zur Registerkarte "Phasen erstellen" und dann auf "Binär mit Bibliotheken verknüpfen". Klicken Sie auf das kleine "+" unten und suchen Sie 'CoreData.framework' und fügen Sie es Ihrem Projekt hinzu
Importieren Sie dann entweder Coredaten für alle Objekte, die Sie benötigen (auf nicht sexy Weise), indem Sie:
Schnell
Ziel c
oder fügen Sie den Import unter den üblichen Importen in Ihre .pch-Datei (viel sexy) wie folgt hinzu:
Schritt 2: Fügen Sie das Datenmodell hinzu
Um die .xcdatamodel-Datei hinzuzufügen, klicken Sie mit der rechten Maustaste auf Ihre Dateien im rechten Bereich (wie in einem Ressourcenordner zur sicheren Aufbewahrung) und wählen Sie "Neue Datei hinzufügen". Klicken Sie bei Auswahl Ihres Dateityps auf die Registerkarte "Kerndaten" und dann auf "Klicken Sie auf". Datenmodell ', geben Sie ihm einen Namen und klicken Sie auf Weiter und Fertig stellen. Es wird dann Ihrem Projekt hinzugefügt. Wenn Sie auf dieses Modellobjekt klicken, wird die Oberfläche angezeigt, über die Sie die Entitäten mit den gewünschten Beziehungen zu Ihrem Projekt hinzufügen können.
Schritt 3: App Delegate aktualisieren
In Swift auf AppDelegate.swift
Stellen Sie in Ziel C sicher, dass Sie diese Objekte zu AppDelegate.h hinzufügen
Synthetisieren Sie die vorherigen Objekte in AppDelegate.m folgendermaßen:
Fügen Sie dann diese Methoden zu AppDelegate.m hinzu (stellen Sie sicher, dass Sie den Namen des Modells, das Sie hinzugefügt haben, an den angezeigten Stellen einfügen):
Schritt 4: Bringen Sie die Datenobjekte zu den ViewControllern, auf denen Sie die Daten benötigen
Option 1. Verwenden Sie den ManagedObjectContext des App-Delegaten von VC (bevorzugt und einfacher).
Wie von @ brass-kazoo vorgeschlagen - Rufen Sie einen Verweis auf AppDelegate und seinen verwalteten Objektkontext über Folgendes ab:
Schnell
Ziel c
in Ihrem ViewController
Option 2. Erstellen Sie ManagedObjectContext in Ihrer VC und lassen Sie es mit AppDelegates aus dem AppDelegate (Original) übereinstimmen.
Zeigt nur die alte Version für Ziel C an, da die bevorzugte Methode viel einfacher zu verwenden ist
im ViewController.h
Im ViewController.m
Stellen Sie in AppDelegate oder der Klasse, in der der ViewController erstellt wird, fest, dass der verwaltete Objekttext mit dem AppDelegate identisch ist
Wenn Sie möchten, dass der Viewcontroller, der Core Data verwendet, ein FetchedResultsController ist, müssen Sie sicherstellen, dass sich dieses Material in Ihrem ViewController.h befindet
Und das ist in ViewController.m
Nach all dem können Sie jetzt diesen manageObjectContext verwenden, um alle üblichen fetchRequests auszuführen, die für die CoreData-Güte erforderlich sind! Genießen
quelle
[[UIApplication sharedApplication] delegate]
und dann den Kontext über[appDelegate managedObjectContext]
Für Swift 3: ENTHÄLT DAS SPEICHERN UND ABRUFEN VON DATEN
Schritt 1 : Framework hinzufügen
Schritt 2: Datenmodell hinzufügen
Datei> Neu> Datei> Kerndaten> Datenmodell
SampleData
resultierende DateiSampleData.xcdatamocelId
Schritt 3: Fügen Sie Ihrem App-Delegaten die folgenden Funktionen hinzu und fügen Sie oben "CoreData importieren" hinzu
SCHRITT 4: Hinzufügen von Entität und Attribut zum Modell
a) Entität hinzufügen
b) Attribut hinzufügen
SCHRITT 5: Daten speichern
SCHRITT 5: Daten abrufen
quelle
Versuchen Sie, eine von Core Data unterstützte Cocoa-Anwendung zu erstellen, und sehen Sie sich AppDelegate an. Dort sehen Sie Implementierungsmethoden für den Kerndatenstapel sowie eine Modelldatei für verwaltete Objekte zum Definieren Ihrer Entitäten und anderer Kerndaten.
Sie haben uns nur den Header (dh die Deklaration) gezeigt, aber nicht die Implementierung (dh die Definition) des Core Data Stacks.
quelle
Wenn Sie in xcode 4 auf dasselbe Problem stoßen wie ich. Es ist anders: Ich musste das Projekt auswählen und dann in den Zielen "Binär mit Bibliotheken verknüpfen" erweitern , um die aktuellen Bibliotheken anzuzeigen. Klicken Sie dort auf das Pluszeichen (+), um weitere benötigte Bibliotheken auszuwählen. Ich habe es oben im Projekt platziert und musste es (Drag & Drop) in die Frameworks-Gruppe verschieben , aber das war es.
quelle
Wie Eimantas sagte, fehlt Ihnen die Implementierung des Core Stacks, wie
Eine Lösung wäre, ein neues Kerndatentreiberprojekt zu erstellen und die Implementierung in Ihr Projekt zu kopieren / einzufügen.
quelle
Für Swift 3:
Datei-> neue Datei-> CoreData-> Modell zum Erstellen eines Modells.
Weitere Informationen zur Implementierung finden Sie unter diesem Link .
quelle
// In Swift 2.2 können Sie Folgendes tun, ohne die AppDelegate-Datei zu ändern.
Datei-> neue Datei-> ios-> Cocoa Touch-Klasse -> setzen Sie ihre Unterklasse als NSObject-> benennen Sie sie als DataController.swift In der Datei enthalten ///
UIKit importieren CoreData-Klasse importieren DataController: NSObject {
}}
//////
/////// seed () -> def
// fetch () def
quelle
view.h
detail.h
quelle
.h
quelle
quelle
quelle
Beispielcodierungsansicht1
Beispiel Detailansicht
Savebutton
quelle