0

Je suis en train d'écrire deux applications (iPhone et de bureau) pour réaliser ce qui a été décrit dans le lien suivant:Core Data quesition

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

Ok. J'ai donc créé une application de bureau très simple avec une seule entité nommée Client avec un champ d'attribut de chaîne appelé nom. J'ai également généré la classe Model correspondante.

J'ai couru l'application a ajouté un couple de noms de clients à la liste et enregistré le fichier (comme Testing.sqlite).

Maintenant, dans mon application iphone équivalente, je tente de charger le fichier. J'ai d'abord généré l'application en utilisant l'un des modèles d'application et inclus les données de base. NB: J'ai mis en miroir l'entité Client et généré la classe Model correspondante.

Je suis allé dans ma classe et la méthode modifiée persistentStoreCoordinator « délégué application » pour faire référence à mon dossier « Testing.sqlite » à savoir

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

J'ai aussi copié le fichier application de bureau enregistrée dans le prévu location ie

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

Donc maintenant en théorie, au moins chacune des deux applications devrait être la même. Cependant, lorsque j'essaie de charger les données à partir du, il semble toujours être vide. Mon code ressemble un peu à ceci:

// 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]; 

Je n'arrive pas à comprendre ce qui ne va pas. Tous les conseils ou suggestions seraient totalement appréciés.

Lorsque j'ai regardé l'instance de persistanceStoreCoordinator, managedObjectContext, tableau résultant (NSArray) lors du débogage, je peux voir qu'il semble contenir 0 enregistrements pour tous ces éléments. Donc je suis confus.

NB: Le fichier Testing.sqlite contient des entrées.

Merci à l'avance, Matt

Répondre

0

copie simplement le fichier de base de données SQLite ne fonctionnera pas lors de l'utilisation de base de données. Vous devez répliquer entièrement le magasin persistant que vous avez créé dans votre application de bureau. Toutefois, cela peut être un problème lié au fait que Core Data ne voit pas votre fichier de base de données même si vous l'avez copié. Effectuez les opérations suivantes:

1) ajoutez votre fichier de base de données à votre projet dans le groupe de ressources 2) utiliser cette méthode pour copier réellement votre fichier de base de données en place

- (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; 

    } 

Une fois que vous avez copié le fichier de base de données, son chemin de fichier est renvoyé et vous l'utilisez pour ouvrir la base de données.

+0

Merci pour ce code! Très utile. Cependant, je ne sais toujours pas ce que vous entendez par "répliquer complètement le magasin persistant"? Mon fichier xcdatamodel et les classes associées dans mon application iphone sont les mêmes que mon application mac. Quelles sont les autres étapes à suivre? – Sway

+0

Il s'est avéré qu'ils étaient subtilement différents. Après correction de cela, cela a fonctionné un régal. Merci encore pour votre aide. – Sway

Questions connexes