Chciałbym dodać podstawowe dane do istniejącego projektu iPhone'a, ale nadal otrzymuję wiele błędów kompilacji:
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before 'NSManagedObjectModel'
- ...
Już dodałem Core Data Framework do celu (kliknij prawym przyciskiem myszy mój projekt w „Targets”, „Add” - „Existing Frameworks”, „CoreData.framework”).
Mój plik nagłówkowy:
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
[...]
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
czego mi brakuje? Rozpoczęcie nowego projektu nie wchodzi w grę ...
Wielkie dzięki!
edytuj
przepraszam, mam te implementacje ... ale wygląda na to, że brakuje biblioteki ... metody implementacji są pełne z błędami kompilacji, takimi jak " managedObjectContext undeclared
", " NSPersistentStoreCoordinator undeclared
", ale także z "Oczekiwany") 'przed NSManagedObjectContext
"(chociaż jest wygląda na to, że nawiasy są poprawne) ...
#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;
}
Aby wyjaśnić wszystkie kroki, które musisz wykonać, aby dodać dane podstawowe do projektu, który wcześniej ich nie miał:
Krok 1: Dodaj strukturę
Kliknij miejsce docelowe aplikacji (w lewym okienku jest to górna ikona z nazwą aplikacji), a następnie przejdź do zakładki „Fazy tworzenia”, a następnie „Połącz pliki binarne z bibliotekami”, kliknij mały „+” u dołu i znajdź „CoreData.framework” i dodaj go do swojego projektu
Następnie zaimportuj coredata do wszystkich obiektów, których potrzebujesz (w sposób nie-sexy), używając:
Szybki
Cel C
lub dodaj import poniżej wspólnych importów w pliku .pch (znacznie bardziej efektownie) w następujący sposób:
Krok 2: Dodaj model danych
Aby dodać plik .xcdatamodel, kliknij prawym przyciskiem myszy / kliknij z naciśniętym klawiszem Control na swoje pliki w prawym okienku (jak w folderze Zasoby do bezpiecznego przechowywania) i wybierz opcję Dodaj nowy plik, kliknij kartę Dane podstawowe podczas wybierania typu pliku, a następnie kliknij przycisk ' Model danych ', nadaj mu nazwę i kliknij Dalej i Zakończ, a doda go do twojego projektu. Po kliknięciu tego obiektu modelu zobaczysz interfejs umożliwiający dodanie jednostek do projektu z dowolnymi relacjami, które chcesz.
Krok 3: Zaktualizuj pełnomocnika aplikacji
W Swift na AppDelegate.swift
W celu C upewnij się, że dodajesz te obiekty do AppDelegate.h
Zsyntetyzuj poprzednie obiekty w AppDelegate.m w następujący sposób:
Następnie dodaj te metody do AppDelegate.m (pamiętaj, aby umieścić nazwę dodanego modelu w pokazanych miejscach):
Krok 4: Pobierz obiekty danych do kontrolerów ViewControllers tam, gdzie potrzebujesz danych
Opcja 1. Użyj ManagedObjectContext delegata aplikacji z VC (preferowane i łatwiejsze)
Zgodnie z sugestią @ brass-kazoo - Pobierz odwołanie do AppDelegate i jego managedObjectContext poprzez:
Szybki
Cel C
w Twoim ViewController
Opcja 2. Utwórz ManagedObjectContext w swoim VC i dopasuj go do AppDelegate z AppDelegate (Original)
Pokazuje tylko starą wersję dla celu C, ponieważ jest znacznie łatwiejsza w użyciu preferowanej metody
w ViewController.h
W pliku ViewController. M
W AppDelegate lub klasie, w której jest tworzony ViewController, ustaw managedObjectContext tak, aby był taki sam jak AppDelegate
Jeśli chcesz, aby kontroler widoku korzystający z podstawowych danych był kontrolerem FetchedResultsController, musisz upewnić się, że te elementy znajdują się w Twoim ViewController.h
A to jest w ViewController.m
Po tym wszystkim możesz teraz użyć tego managedObjectContext do uruchamiania wszystkich zwykłych żądań fetchRequests potrzebnych do dobroci CoreData! Cieszyć się
źródło
[[UIApplication sharedApplication] delegate]
[appDelegate managedObjectContext]
W przypadku Swift 3: OBEJMUJE ZAPISYWANIE I ODZYSKIWANIE DANYCH
Krok 1 : Dodaj strukturę
Krok 2: Dodaj model danych
Plik> Nowy> Plik> Dane podstawowe> Model danych
SampleData
byłby to plik wynikowySampleData.xcdatamocelId
Krok 3: Dodaj poniższe funkcje do delegata aplikacji i dodaj „import CoreData” na górze
KROK 4: Dodawanie jednostki i atrybutu do modelu
a) Dodaj jednostkę
b) Dodaj atrybut
KROK 5: Zapisywanie danych
KROK 5: Pobieranie danych
źródło
Spróbuj utworzyć aplikację Cocoa obsługiwaną przez dane podstawowe i spójrz na AppDelegate. Zobaczysz tam podstawowe metody implementacji stosu danych, a także plik modelu obiektu zarządzanego do definiowania jednostek i innych elementów związanych z podstawowymi danymi.
Pokazałeś nam tylko nagłówek (tj. Deklarację), ale nie implementację (tj. Definicję) stosu Core Data.
źródło
Jeśli napotkasz ten sam problem w xcode 4, tak jak ja. Jest inaczej: musiałem wybrać projekt, a następnie w celach rozwinąć „Połącz plik binarny z bibliotekami”, który pokazuje bieżące biblioteki. Następnie kliknij znak + (znak plus), aby wybrać dodatkowe potrzebne biblioteki. Umieściłem go w górnej części projektu i musiałem go przenieść (przeciągnij i upuść) do grupy Frameworks , ale to wszystko.
źródło
Jak stwierdził Eimantas, brakuje ci implementacji stosu podstawowego, na przykład
Rozwiązaniem byłoby utworzenie nowego projektu podstawowego sterownika danych i skopiowanie / wklejenie implementacji do projektu.
źródło
Dla Swift 3:
Plik-> nowy plik-> CoreData-> Model, aby utworzyć model.
Skorzystaj z tego łącza, aby uzyskać więcej informacji o tym, jak go wdrożyć.
źródło
// w Swift 2.2 możesz wykonać następujące czynności bez zmiany pliku AppDelegate.
Plik-> nowy plik-> ios-> cocoa Touch class -> ustaw jego podklasę na NSObject-> nazwij go jako DataController.swift Wewnątrz pliku include ///
import UIKit import CoreData class DataController: NSObject {
}
//////
/////// seed () -> def
// fetch () def
źródło
view.h
detail.h
źródło
.h
źródło
źródło
źródło
przykładowy widok kodowania 1
przykładowy widok szczegółów
savebutton
źródło