名前、色、体重などの特定のプロパティに基づいて生物を表示するアプリを作成していますが、これらのプロパティは実行時までわかりません。これが、プログラムで NSManagedObjectModel を作成している理由です。NSLogステートメントを使用して生物エンティティのプロパティを表示するため、モデルを適切に初期化できるようです。しかし、メソッドを呼び出すと:
[orgPersistentStoreCoordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storUrl options:nil error:&error]
NO が返され、永続ストア コーディネーター メソッドで次のようなエラーが発生します。
「永続ストアを追加できませんでした:操作を完了できませんでした。(Cocoa エラー 256)」
これらのオプションをオンにしようとしましたが、それでも同じエラーが発生しました:
NSString * const NSMigratePersistentStoresAutomaticallyOption;
NSString * const NSInferMappingModelAutomaticallyOption;
完全なコードは次のとおりです。
- (NSPersistentStoreCoordinator *)orgPersistentStoreCoordinator {
if (orgPersistentStoreCoordinator != nil) {
return orgPersistentStoreCoordinator;
}
NSURL *storUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent:@"organisms.sqlite"]];
NSError *error = nil;
orgPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self orgManagedObjectModel]];
NSLog(@"Entities: %@",[[self orgManagedObjectModel] entities]);
if (![orgPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storUrl options:nil error:&error]) {
/*Error for store creation should be handled in here*/
NSLog(@"Could not add persistent store:%@",[error localizedDescription]);
}
return orgPersistentStoreCoordinator;
}
そして、プログラムで ManagedObjectModel を作成する方法のスニペットを次に示します。
+ (NSManagedObjectModel *) orgManagedObjectModel
{
FieldGuide *f = [FieldGuide sharedFieldGuide];
NSManagedObjectModel *orgModel = [[NSManagedObjectModel alloc]init];
NSEntityDescription *organismEntity = [[NSEntityDescription alloc]init];
[organismEntity setName:@"OrganismCoreData"];
[organismEntity setManagedObjectClassName:@"OrganismCoreData"];
[orgModel setEntities:[NSArray arrayWithObject:organismEntity]];
NSMutableArray *orgEntityProperties = [[NSMutableArray alloc]init];
// 1. Name attributes
for (NameParameter *n in f.nameAttributes)
{
NSAttributeDescription *nameAttr = [[NSAttributeDescription alloc]init];
[nameAttr setName:n.name];
[nameAttr setAttributeType:NSStringAttributeType];
[orgEntityProperties addObject:nameAttr];
}
[organismEntity setProperties:orgEntityProperties];
return orgModel;
}
最後に、有機体を挿入して NSManagedObjectContext 経由で保存しようとすると、アプリが終了し、ログに次のように表示されます。
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
どんな助けや指示も大歓迎です、ありがとう!
編集:はい、シミュレーターからアプリを削除し、ターゲットをクリーンアップし、ファインダーを介してドキュメントフォルダーからorganics.sqliteを削除しようとしました。
編集 #2: addPersistentStore メソッドも別のエラーを返すことを追加するのを忘れていました:
2012-04-30 14:13:46.109 biodex[7510:14803] CoreData: error: (1) I/O error for database at /Users/junryandelacruz/Library/Application Support/iPhone Simulator/5.1/Applications/ACE957AF-2FC0-4EAF-B226-5019F70FAB90/Documents/organisms.sqlite. SQLite error code:1, 'near "OR": syntax error'