0

Я пытаюсь написать два приложения (iPhone и настольные), чтобы достичь того, что было описано в следующей ссылке:Ядро quesition данных

core-data-is-it-possible-to-build-a-desktop-app-to-create-the-data-model-for-an

Ok. Таким образом, я создал очень простое настольное приложение, у которого есть единый объект с именем Client с полем атрибута строки с именем name. Я также создал соответствующий класс модели.

Я запустил приложение, добавив пару имен клиентов в список и сохранил файл (как Testing.sqlite).

Теперь в моем эквивалентном приложении iphone я пытаюсь загрузить файл. Сначала я сгенерировал приложение с использованием одного из шаблонов приложений и включил Core Data. NB: Я отразил объект Client и создал соответствующий класс Model.

Я пошел в мой класс «приложение делегат» и внес изменения в метод persistentStoreCoordinator ссылаться на мой файл «Testing.sqlite» т.е.

NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Testing.sqlite"]]; 

Я также скопировал сохраненный файл настольного приложения на ожидаемый местоположение, т.е.

~/Library/Application Support/IPhone Simulator/User/... etc. 

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

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

// fetch the delegate. 
TestingAppDelegate *app = (TestingAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *managedObjectContext = [app managedObjectContext]; 

// construct the request. 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

// execute the request. 
NSError *error; 
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error]; 

if (results == nil) { 
    // Handle the error.   
    NSLog(@"No data loaded"); 
} 

NSLog(@"Returned: %@", results);  

// finally release 
[results release]; 
[request release]; 

Я не могу понять, что происходит. Любые советы или предложения будут полностью оценены.

Когда я посмотрел на экземпляр persistanceStoreCoordinator, managedObjectContext, result array (NSArray) во время отладки, я вижу, что он, кажется, содержит 0 записей для всех этих. Поэтому я смущен.

NB: Файл Testing.sqlite содержит записи.

Спасибо заранее, Matt

ответ

0

Просто копирование SQLite файл базы данных не будет работать при использовании Core Data. Вам необходимо полностью воспроизвести постоянный магазин, созданный в приложении для рабочего стола.

Однако это может быть проблема, связанная с тем, что Core Data не видит ваш файл базы данных, даже если вы его скопировали. Попробуйте следующее:

1) добавить свой файл базы данных для вашего проекта в группе ресурсов 2) использовать этот метод на самом деле скопировать файл базы данных на месте

- (NSString *) initialize_db { 
    NSString *DATABASE_RESOURCE_NAME = @"testing"; 
    NSString *DATABASE_RESOURCE_TYPE = @"sqlite"; 
    NSString *DATABASE_FILE_NAME = @"testing.sqlite"; 

    // copy the database from the bundle if necessary 
    // look to see if DB is in known location (~/Documents/$DATABASE_FILE_NAME) 


    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentFolderPath = [searchPaths objectAtIndex: 0]; 
     NSString *dbFilePath = [documentFolderPath stringByAppendingPathComponent: DATABASE_FILE_NAME]; 
     [dbFilePath retain]; 

     if (! [[NSFileManager defaultManager] fileExistsAtPath: dbFilePath]) { 
      // didn't find db, need to copy 
      NSString *backupDbPath = [[NSBundle mainBundle] 
             pathForResource:DATABASE_RESOURCE_NAME 
             ofType:DATABASE_RESOURCE_TYPE]; 
      if (backupDbPath == nil) { 
       // couldn't find backup db to copy, bail 
       NSLog (@"couldn't init db"); 
       return NULL; 
      } else { 
       BOOL copiedBackupDb = [[NSFileManager defaultManager] 
             copyItemAtPath:backupDbPath 
             toPath:dbFilePath 
             error:nil]; 
       if (! copiedBackupDb) { 
        // copying backup db failed, bail 
        NSLog (@"couldn't init db"); 
        return NULL; 
       } 
      } 
     } 


     return dbFilePath; 

    } 

После того, как вы скопировали файл базы данных, у вас есть путь к файлу, и вы используете его для фактического открытия базы данных.

+0

Спасибо за этот код! Очень полезно. Однако я все еще не уверен, что вы подразумеваете под «полностью воспроизвести постоянный магазин»? Мой файл xcdatamodel и связанные классы в моем приложении iphone совпадают с моим Mac-приложением. Какие еще шаги необходимо предпринять? – Sway

+0

Оказалось, что они были немного отличались. После исправления это сработало. В очередной раз благодарим за помощь. – Sway