2015-03-11 2 views
0

Я занимаюсь разработкой iOS, и текущий проект, над которым я работаю (с отключением тренировочных колес), позволяет мне использовать Core Data для сохранения информации.Установка нестандартных базовых данных

Я использовал Core Data на прошлых проектах, но это был простой мастер-Detail VC установки там, где он был экземпляр в контроллере представления корня, используя «консервированный код» и т.д.

Стек на моем текущий проект содержится в файле реализации AppDelegate. Каким должен быть мой didFinishLaunchingWithOptions в реализации AppDelegate, если мой Core Data TVC не находится в нормальном месте в «консервированном коде»?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // TODO: get this set up 
    SavedPOITableViewController *tableViewController = [[SavedPOITableViewController alloc]initWithStyle:UITableViewStylePlain]; 
    tableViewController.managedObjectContext = [self managedObjectContext]; 

    return YES; 
} 

ответ

1

Не позволяйте своему уму стать ограничен каким-либо требованием размещения основной стек данных в файл реализации делегата приложения.

У меня есть надежный и многоуровневый граф объектов ядра данных, стек которого строятся в отдельном классе я называю EstablishCoreData и я видел другие, что имя это так же CoreDataStack и т.д.

В моих didFinishLaunchingWithOptions метод меня одну строку ...

[self configureCoreData]; 

, что относится к этому приложению делегат пользовательский метод ...

- (void)configureCoreData { 
    // Establish connection to EstablishCoreData 
    if (!connectCoreData) 
     connectCoreData = [[EstablishCoreData alloc] init]; 

    // Initiate Core Data stack and set the managedObjectContexts PRIVATE & MAIN 
    if (!self.appDelegatePrivate || !self.appDelegateMain) { 
     [connectCoreData configureCoreDataStack]; 
     [self setAppDelegatePrivate:connectCoreData.mocPrivate]; 
     [self setAppDelegateMain:connectCoreData.mocMain]; 
     NSLog(@"\n%@ - %@ -> Confirm CORE DATA configured with\nNEW managedObjectContext PRIVATE: %@ and\nNEW managedObjectContext MAIN: %@_\n\n", self.className, NSStringFromSelector(_cmd), self.appDelegatePrivate, self.appDelegateMain); 
    } else { 
     NSLog(@"\n%@ - %@ -> Confirm CORE DATA already configured with\nEXISTING managedObjectContext PRIVATE: %@ and\nEXISTING managedObjectContext MAIN: %@_\n\n", self.className, NSStringFromSelector(_cmd), self.appDelegatePrivate, self.appDelegateMain); 
    } 
} 

очевидно, что в фоновом режиме больше работает.

В частной декларации моего приложения делегата я включаю ...

@interface AppDelegate() { 
    EstablishCoreData *connectCoreData; 
} 

и наиболее важные из этих линий относится к пользовательской методе в моем классе EstablishCoreData, который пинает весь на место, будучи ...

[connectCoreData configureCoreDataStack]; 

Этот обычай метод в моих пользовательских классов определяет и/или конкретизирует мой:

  • NSURL *modelURL;
  • NSManagedObjectModel *managedObjectModel;
  • NSURL *storeURL;
  • NSPersistentStoreCoordinator *persistentStoreCoordinator;
  • NSPersistentStore *persistentStore;

и, конечно, устанавливает:

  • главный NSMananagedObjectContext и
  • частных NSMananagedObjectContext.

В моем основном и начальном контроллере представления - вид таблицы контроллер - I включает следующее общие переменные ...

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContextPrivate; 
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContextMain; 

и следующий код реализации ...

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    appDelegate = (DD_AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    [self setManagedObjectContextPrivate:appDelegate.appDelegatePrivate]; 
    [self setManagedObjectContextMain:appDelegate.appDelegateMain]; 

    ...<< etc other code as required >>... 

} 

Все происходит красиво вниз по течению оттуда, используя иерархию диспетчера изображений.

Прочтите замечательную книгу Маркуса С Зарры из «Прагматической книжной полки» «Основные данные, второе издание, хранилище данных и управление для iOS, OS X и iCloud» (январь 2013 г.).

Также стоит упомянуть издательства Apress, «Персистентность Pro iOS с использованием основных данных», Майкл Приват и Роберт Уорнер.

+0

Благодарим вас за столь подробный и тщательный ответ! – Adrian

0

Вы должны иметь ссылку стека данных инициализируется в AppDelegate. И передайте ссылку NSManagedObjectContext на ваш Root ViewController для последующего использования. Кроме того, сохраните свой контекст, когда приложение отключено.

Попробуйте это:

lazy var coreDataStack = CoreDataStack() 
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
let vc = self.window!.rootViewController as YourViewController 
//YourViewController should have the property `context` in order for you to use the stack context later 
vc.managedContext = coreDataStack.context 
} 

и:

func applicationDidEnterBackground(application: UIApplication) { 
coreDataStack.saveContext() 
} 

func applicationWillTerminate(application: UIApplication) { 
coreDataStack.saveContext() 
} 

CoreDataStack:

class CoreDataStack { 
    let context:NSManagedObjectContext 
    let psc:NSPersistentStoreCoordinator 
    let model:NSManagedObjectModel 
    let store:NSPersistentStore? 

    init() { 
    let bundle = NSBundle.mainBundle() 
    let modelURL = 
    bundle.URLForResource("Dog Walk", withExtension:"momd") 
    model = NSManagedObjectModel(contentsOfURL: modelURL!)! 

    psc = NSPersistentStoreCoordinator(managedObjectModel:model) 

    context = NSManagedObjectContext() 
    context.persistentStoreCoordinator = psc 

    let documentsURL = applicationDocumentsDirectory() 
    let storeURL = 
    documentsURL.URLByAppendingPathComponent("Name") 

    let options = 
    [NSMigratePersistentStoresAutomaticallyOption: true] 

    var error: NSError? = nil 
    store = psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: options, error:&error) 

    if store == nil { 
     println("Error adding persistent store: \(error)") 
     abort() 
    } 

    } 

    func saveContext() { 
    var error: NSError? = nil 
    if context.hasChanges && !context.save(&error) { 
     println("Could not save: \(error), \(error?.userInfo)") 
    } 
    } 

    func applicationDocumentsDirectory() -> NSURL { 
    let fileManager = NSFileManager.defaultManager() 

    let urls = fileManager.URLsForDirectory(.DocumentDirectory, 
     inDomains: .UserDomainMask) as [NSURL] 

    return urls[0] 
    } 

    } 
+0

Мне жаль, мой код находится в Swift, это из книги «CoreData by Tutorial» – duan

+0

Благодарим вас за такой подробный и тщательный ответ! Это приложение Objective-C, но я вижу, что это полезно в будущих проектах. – Adrian

Смежные вопросы