2012-06-26 76 views
0

此前,我有一個使用核心數據的應用程序。我使用相同的商店URL來初始化NSManagedObjectModel並創建NSPersistentStoreCoordinator。但是,在新應用程序中,我嘗試使用相同的方式,無法創建模型。所以我必須使用模型url(我在這個論壇中發現它)能夠創建NSManagedObjectModel。什麼是問題?核心數據模型路徑vs商店路徑

下面是從舊的應用程序:

- (NSString *)storeName 
{ 
    return @"ABC.storedata"; 
} 

- (NSURL *)storeUrl 
{ 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName]; 
    return storeURL; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
    if (_managedObjectModel == nil) { 
     _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self storeUrl]]; 
    } 
    return _managedObjectModel; 
} 


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    }  
    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) { 

     abort(); 
    }  

    return _persistentStoreCoordinator; 
} 

這裏是新的應用程序:

- (NSString *)storeName 
{ 
    return @"DEF.sqlite"; 
} 

- (NSURL *)storeUrl 
{ 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName]; 
    return storeURL; 
} 

- (NSURL *)modelUrl 
{ 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DEF" withExtension:@"momd"]; 
    return modelURL; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
    if (_managedObjectModel == nil) { 
     _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self modelUrl]]; 
    } 
    return _managedObjectModel; 
} 


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    }  
    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) { 

     abort(); 
    }  

    return _persistentStoreCoordinator; 
} 

回答

1

你永遠不可能用兩個模型和持久性存儲相同的URL,因爲它們是兩個完全不同的事情。

模型URL必須指向您的Xcode項目中包含的實際模型資源,該資源是一個.momd文件包。持久存儲在你的情況下是一個數據庫,在文件目錄中是一個.sqlite文件。

我無法想象過去它是如何工作的。一種可能性是因爲你的ABC.storedata沒有尾隨的.sqlite,核心數據必須在後臺添加一個.sqlite,並且DEF.storedata可以以某種方式匹配你的模型名稱?

這是初始化一個模型,其中替換「模式」與你在Xcode項目的模型資源有名字的正確方法:

NSURL *modelURL    = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];   
model      = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

至於持久性存儲,沒有任何限制。但在大多數情況下,它應該在應用程序文檔目錄中。

+0

好的。你是對的。我得到了爲什麼舊應用程序工作的原因。舊應用程序使用mergedModelFromBundles,而不是initWithContentsOfURL。 – angelokh