импорт sqlite в coredata - PullRequest
       16

импорт sqlite в coredata

1 голос
/ 15 февраля 2011

Ранее я импортировал предварительно заполненные базы данных sqlite в свои проекты coredata, но теперь я создал проект в 3.2.5.xcode, который изменяет nsurl для nstring в AppDelegate, так что я пошел с этим, но теперь мой sqlite не импортирует в проект,

, если я оставлю свой PersistentStoreCoordinator, чтобы создать новую пустую базу данных, он отлично работает,

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

но когда я изменяю код для импорта предварительно заполненной базы данных (вызывается так же, чтобы уточнить), он выдает мне предупреждение и вылетает,

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"ChildCare_v02.sqlite"]; //WARNING !! here
NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
//NSURL *storeURL = [[self applicationDocumentsDirectory]    URLByAppendingPathComponent:@"ChildCare_v02.sqlite"]; //actual SDK style for blank db

// Put down default db if it doesn't already exist
    NSFileManager *fileManager = [NSFileManager defaultManager];
   if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle]  pathForResource:@"ChildCare_v02" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
    }
NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc]  initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {


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

Это журнал сбоев вconsole

-[NSURL stringByAppendingPathComponent:]: unrecognized selector sent to instance  0x5b40e50
 2011-02-15 21:06:59.245 Staff_02c[469:207] *** Terminating app due to uncaught  exception 'NSInvalidArgumentException', reason: '-[NSURL stringByAppendingPathComponent:]:     unrecognized selector sent to instance 0x5b40e50'

Как это исправить пожалуйста ??Просто когда я жестко, я получал основные данные!Тесто !!

Ответы [ 5 ]

5 голосов
/ 15 февраля 2011

Apple изменила вспомогательный метод, который возвращает словарь приложения в основных шаблонах данных.

Вы полагаетесь на эту версию:

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

, но Apple изменила ее на эту версию

- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

чтобы исправить это, просто измените это.

NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"ChildCare_v02.sqlite"]; //WARNING !! here
NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
//NSURL *storeURL = [[self applicationDocumentsDirectory]    URLByAppendingPathComponent:@"ChildCare_v02.sqlite"]; //actual SDK style for blank db

на это

//NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"ChildCare_v02.sqlite"]; //WARNING !! here
//NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
NSURL *storeUrl = [[self applicationDocumentsDirectory]    URLByAppendingPathComponent:@"ChildCare_v02.sqlite"]; //actual SDK style for blank db

извините, но omfg

4 голосов
/ 15 февраля 2011

спасибо Ишу, вы мне очень помогли, указав путь NSArray !!!

это было решением, которое я в конечном итоге привел к просветлению!

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}



NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"ChildCare_v02.sqlite"];

NSString *storePath = [[NSBundle mainBundle] pathForResource:@"ChildCare_v02" ofType:@"sqlite"];


NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ChildCare_v02.sqlite"]; //este es el que sirve!!! CREE ESTE

NSLog(@"store URL %@", storeURL);

    // Put down default db if it doesn't already exist
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:writableDBPath]) {
    NSLog(@"proceda aqui");
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"ChildCare_v02" ofType:@"sqlite"];
    NSLog(@"no existe todavia");
    NSLog(@"defalultStorePath %@", defaultStorePath);


    if (defaultStorePath) {
      [fileManager copyItemAtPath:defaultStorePath toPath:writableDBPath error:NULL];
        NSLog(@"storePath= %@", storePath);
    }
}    

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

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

   return persistentStoreCoordinator_;
    }

надеюсь, это поможет некоторым новичкам, таким какЕсли я хочу импортировать предварительно заполненный sqlite в базу данных coredata, обратите внимание, что сначала нужно создать пустую базу данных, сохранить структуру, а затем заполнить ее (я использовал браузер базы данных SQLite для импорта столбцов CSV в свой sqlite)

ss9

2 голосов
/ 11 мая 2012

Вам вообще не нужно использовать пути NSString, все это можно сделать с помощью методов NSURL.

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

// If the database doesn't exist copy in the default one
if (![storeURL checkResourceIsReachableAndReturnError:NULL])
{
    NSURL *defaultStoreURL = [[NSBundle mainBundle] URLForResource:@"Database" withExtension:@"sqlite"];

    if ([defaultStoreURL checkResourceIsReachableAndReturnError:NULL])
    {
        NSFileManager *fileManager = [NSFileManager defaultManager];
        [fileManager copyItemAtURL:defaultStoreURL toURL:storeURL error:NULL];
    }
}
1 голос
/ 15 февраля 2011

stringByAppendingPathComponent этот метод является методом экземпляра класса NSString. Поэтому вы не можете получить доступ к этому методу в NSURL.

поэтому для исправления измените эту строку

NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"ChildCare_v02.sqlite"];

по этому коду

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"ChildCare_v02.sqlite"];
0 голосов
/ 15 февраля 2011

Сбой не связан конкретно с Core Data.

Похоже, вы вызываете метод, который не существует.

В NSURL метод является "URLByAppendingPathComponent".

Если вам нужен stringByAppendingPathComponent, он находится в NSString.

Скорее всего, вы получили предупреждение об этом во время сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...