2010-09-02 4 views
0

mon programme doit prendre une base de données SQL pré-remplie, puis enregistrer les enregistrements dans la base de données de l'application. Malheureusement, pour une raison quelconque l'application se ferme dans cette méthode dans le délégué de l'application:Impossible d'enregistrer la base de données sql pré-remplie dans la base de données SQL de base: managedObjectModel non trouvé

#pragma mark - 
#pragma mark Core Data stack 
- (NSManagedObjectModel *)managedObjectModel { 
    if (managedObjectModel_ != nil) { 
     return managedObjectModel_; 
} 
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"iProspectLite" ofType:@"sqlite"]; 
NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
return managedObjectModel_; 
} 

il semble que l'application ne peut pas trouver un valide managedObjectModel_, ou il n'existe pas, ou ne crée pas un. Comment puis-je résoudre ceci?

l'un des messages d'erreur que je reçois sur la console est la suivante: Mettre fin application en raison de uncaught raison d'exception: [NSKeyedUnarchiver initForReadingWithData:]

partie de ce que j'ai rétréci vers le bas à l'NSManagedObject, en ce doesn ne semble pas être créé ou trouvé.

Autres informations qui peuvent être utiles: j'ai ajouté une entité et les attributs définis comme décrit dans de nombreux autres tutoriels données de base ce qui suit est la classe qui définit mon entité:

#import "Mine.h" 


@implementation Mine 

@dynamic primarykey; 
@dynamic name; 
@dynamic firstCommodity; 
@dynamic longitude; 
@dynamic county; 
@dynamic secondCommodity; 
@dynamic latitude; 
@dynamic thirdCommodity; 

@end 

Répondre

1

Votre problème est que vous essayez de charger votre fichier modèle à partir du chemin d'accès à un magasin persistant SQL dans le regroupement d'applications. Les magasins et les fichiers modèles sont deux types distincts de fichiers avec deux fonctions distinctes. Vous ne pouvez pas initialiser une instance NSManagedObjectModel à partir d'un fichier SQL et vice versa, car les deux types de fichiers contiennent des informations complètement différentes. Vous devez modifier le pathForResource: pour rechercher le bon fichier. Le type de fichier est mom et le nom par défaut est le nom de l'application vous devez donc utiliser quelque chose comme:

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"AppName" ofType:@"mom"]; 

(. Si vous vous avez nommé modèle autre chose, utiliser ce nom)

Tout cela n'a rien à faire avec l'importation d'un fichier SQL existant. Cependant, vous devrez corriger cela avant d'importer le SQL comme d'autres l'ont suggéré.

+0

ok cela a plus de sens. J'ai changé les chaînes à mon nom App et maman, et maintenant quand le programme se bloque, il me donne cette erreur: Terminaison de l'application en raison de l'exception non interceptée 'NSInvalidArgumentException', raison: '*** - [NSURL initFileURLWithPath:]: paramètre de chaîne nil Ce qui me porte à croire qu'il ne peut pas trouver le fichier maman. Ce qui est bizarre. Heck je ne peux pas sembler trouver un fichier maman n'importe où sur mon mac, alors peut-être core-data ne fait pas un tel fichier? –

+0

Dans votre projet en code, vous aurez un fichier avec une extension de 'xcdatamodel' (c'est celui avec votre graphe d'entité.) Le fichier' mom' dans la construction aura le même nom que ce fichier. Vous pouvez également utiliser 'modelByMergingModels:' qui va automatiquement localiser tous les fichiers du modèle pour vous. – TechZen

+0

J'ai choisi le vôtre comme réponse parce que c'était le plus proche de ce que j'ai trouvé travaillé. il doit être pathForResource: @ "AppName" ofType: @ "momd" –

1

De Apple Core Data Development Guide:

Compiling a Data Model

A data model is a deployment resource. In addition to details of the entities and properties in the model, a model you create in Xcode contains information about the diagram—its layout, colors of elements, and so on. This latter information is not needed at runtime. The model file is compiled to remove the extraneous information and make runtime loading of the resource as efficient as possible. The xcdatamodel "source" file is compiled into a mom deployment file using the model compiler, momc .

en d'autres termes, les modèles d'objets gérés sont « compilés » de Xcode modèle de données « source » par Xcode au cours du processus de construction, et ce fichier .mom est plac ed dans le bundle d'application. Vous devrez peut-être créer un fichier de modèle de données manuellement. Pour contourner ce problème, j'utilise un outil de ligne de commande Core Data-savvy pour pré-remplir les fichiers de base de données SQLite que j'utilise avec mes projets iPhone.

Edit:

Si M. Zarra est correct (et il est généralement), alors vous devriez écrire un outil de ligne de commande de la manière que j'ai décrit, pour ouvrir la base de données existante, puis préremplir une nouveau fichier de base de données SQLite avec Core Data. C'est un peu pénible, mais ça va marcher.

+0

Je pensais avoir déjà créé un datamodel. J'ai ajouté une entité et des attributs au modèle de données, ainsi qu'une classe spécifique pour cette entité, comme décrit dans un didacticiel sur les données de base. –

+0

Vérifiez l'ensemble d'applications dans votre répertoire de construction. Y at-il un fichier '.mom' présent? (Faites un clic droit sur Cible, Révéler dans le Finder, cliquez avec le bouton droit sur .app, Afficher le contenu du paquet) Sinon, et vous êtes sûr d'avoir un 'xcdatamodel', alors assurez-vous que le fichier' xcdatamodel' est listé sous le " Compile Sources "section de votre cible. –

+0

Un clic droit sur la cible sur xcode n'appelle pas l'option reveal in finder. Cependant, en cherchant dans les fichiers de mon ordinateur, je n'ai pas pu trouver un fichier .mom. –

2

Où obtenez-vous la base de données SQLite pré-remplie? S'il n'est pas créé avec Core Data, il ne fonctionnera pas. Les données de base ne peuvent lire que les fichiers SQLite créés avec des données de base.

+0

Je l'obtiens du site Web de l'USGS. Ce que je fais est de le charger directement en utilisant des instructions sql dans l'application, de créer des objets à partir de ces données, puis de les stocker dans les données de base. –

+0

Donc en effet je n'utilise pas coredata pour lire la base de données remplie, mais j'utilise des coredata pour le stocker dans une autre base de données pour une utilisation future dans mon programme. –

Questions connexes