Предварительно заполнить основные данные в iOS 5

#objective-c #core-data #ios5

#цель-c #основные данные #ios5

Вопрос:

Похоже, что в NSPersistentStoreCoordinator методе iOS 5 произошли некоторые изменения. Я пытаюсь получить предварительно заполненную базу данных… похоже, что это не работает, сбоев нет, но, похоже, ни один из данных не существует… Есть предложения?

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSURL *storePath = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"DataModel.sqlite"];

    /*
     Set up the store.
     For the sake of illustration, provide a pre-populated default store.
     */
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn't exist, copy the default store.
    if (![fileManager fileExistsAtPath:[storePath absoluteString]]) {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"sqlite"];
        if (defaultStorePath) {
            [fileManager copyItemAtPath:defaultStorePath toPath:[storePath absoluteString] error:NULL];
        }
    }


    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"DataModel.sqlite"];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:amp;error])
    {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;
}
  

Комментарии:

1. Я не могу сказать вам, почему это не работает, но я могу сказать вам, что точно такой же код работает для меня. Скопирована ли база данных sqlite в вашу папку Documents?

2. @user1028028 привет, ты получил хороший ответ. почему вы не одобряете ответ Иво Леко?

Ответ №1:

Проблема заключается в applicationDocumentsDirectory методе, который выдает неправильную абсолютную строку. Это не совсем неправильно, но не подходит для NSFileManager класса.

Решение очень простое. Вам нужно написать другой метод, который я вызвал applicationDocumentsDirectory2 .

Итак, сначала перейдите к заголовочному файлу вашего AppDelegate и объявите метод:

 - (NSString *)applicationDocumentsDirectory2;
  

Теперь перейдите к файлу .m и определите метод:

 - (NSString *)applicationDocumentsDirectory2 {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}
  

И, наконец, просто измените persistentStoreCoordinator метод на:

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }
    NSError *error = nil;

   NSString *storePath = [[self applicationDocumentsDirectory2] stringByAppendingPathComponent: @"DataModel.sqlite"];

    /*
     Set up the store.
     For the sake of illustration, provide a pre-populated default store.
     */
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn't exist, copy the default store.
    if (![fileManager fileExistsAtPath:storePath]) {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"sqlite"];
        if (defaultStorePath) {
            if(![fileManager copyItemAtPath:defaultStorePath toPath:storePath error:amp;error]) {
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);


            }
        } 
    }


    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"DataModel.sqlite"];

    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:amp;error])
    {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;

}
  

Вот и все! 🙂