2012-04-30 117 views
0

我正在製作一個基於某些屬性(如名稱,顏色,重量等)顯示有機體的應用程序,但這些屬性直到運行時纔會知道。這就是爲什麼我編程創建NSManagedObjectModel。看起來我能夠正確地初始化模型,因爲我使用NSLog語句來顯示有機體實體的屬性。但是,當我調用該方法:核心數據:無法添加持久性存儲到協調器

[orgPersistentStoreCoordinator 
addPersistentStoreWithType:NSSQLiteStoreType           
configuration:nil URL:storUrl options:nil error:&error] 

它返回NO,我讓我的持久存儲協調方法的錯誤,說:

"Could not add persistent store:The operation couldn’t be completed. (Cocoa error 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.' 

任何幫助或方向將不勝感激,謝謝!

編輯: 是的,我已經嘗試從模擬器中刪除應用程序,清理目標,並通過finder從文檔文件夾中刪除organisms.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' 

回答

1

貌似有一個在您storeURL一個錯誤。這是「未知的文件讀取錯誤」,通常與文件的路徑有關。

documentation

NSFileReadUnknownError = 256, 

第二個錯誤肯定有無關添加持久性存儲。檢查代碼中的「OR」謂詞。

+0

嗯。我認爲這將是原因,但我認爲該網址是正確的。難道預先沒有文檔目錄中的有機體文件?如果不存在,核心數據會爲您創建。 – user1031872

+0

實際上,方法**總是**嘗試創建一個新的持久存儲。如果已經存在,你會得到一個錯誤。 – Mundi

+0

我從模擬器中刪除了我的應用程序。然後重建並在模擬器上運行,問題就消失了。可能是一個損壞的SQL文件。 –

相關問題