我不想進入很長的答案,因爲我沒有使用MagicalRecord,而且我也沒有IDEA它如何管理模型配置。
這就是說,你想要解決這個問題的方式是使用模型配置和多個存儲文件。這個問題既好理解又有據可查。
Apple's documentation是一個很好的起點,並且有numerous articles and examples on the web。
EDIT
行DAN,這裏是用於使用多個配置有點做作(但簡單)的例子。您應該能夠將其複製/粘貼到測試文件中並運行它,這應該允許您追蹤正在發生的事情並獲得基本的理解。
請注意,這不是我會建議編寫生產代碼或測試的方式(我也不建議忽略錯誤),但我希望這有助於解釋一些事情,並允許您進行試驗。
我把代碼分解成了幾個輔助方法,希望能更好地解釋。
首先,我們創建一個簡單模型,其中包含四個實體,我們將在這兩個實體中放入兩個參數。
- (NSManagedObjectModel *)makeConfigurationModel {
NSAttributeDescription *nameAttr = [[NSAttributeDescription alloc] init];
nameAttr.name = @"name";
nameAttr.attributeType = NSStringAttributeType;
NSEntityDescription *foo = [[NSEntityDescription alloc] init];
foo.name = @"Foo";
foo.properties = @[[nameAttr copy]];
NSEntityDescription *bar = [[NSEntityDescription alloc] init];
bar.name = @"Bar";
bar.properties = @[[nameAttr copy]];
NSEntityDescription *blarg = [[NSEntityDescription alloc] init];
blarg.name = @"Blarg";
blarg.properties = @[[nameAttr copy]];
NSEntityDescription *baz = [[NSEntityDescription alloc] init];
baz.name = @"Baz";
baz.properties = @[[nameAttr copy]];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] init];
model.entities = @[foo, bar, blarg, baz];
[model setEntities:@[foo, bar] forConfiguration:@"One"];
[model setEntities:@[blarg, baz] forConfiguration:@"Two"];
return model;
}
接下來,一個函數將兩個商店分配給PSC,並創建一些示例實體。該功能還檢查以確保可以訪問所有實體。
- (void)setupDatabaseWithModel:(NSManagedObjectModel*)model
store1:(NSURL*)store1URL
store2:(NSURL*)store2URL {
@autoreleasepool {
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:model];
[psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"One"
URL:store1URL
options:nil
error:NULL];
[psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"Two"
URL:store2URL
options:nil
error:NULL];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.persistentStoreCoordinator = psc;
// Add some entities...
NSArray *entityNames = @[@"Foo", @"Bar", @"Blarg", @"Baz"];
for (NSString *e in entityNames) {
NSManagedObject *obj =
[NSEntityDescription insertNewObjectForEntityForName:e
inManagedObjectContext:moc];
[obj setValue:[NSString stringWithFormat:@"%@ 1", e] forKey:@"name"];
}
[moc save:NULL];
// Should have all of them in this MOC...
for (NSString *e in entityNames) {
NSFetchRequest *fetchRequest = [NSFetchRequest
fetchRequestWithEntityName:e];
NSArray *result = [moc executeFetchRequest:fetchRequest error:NULL];
XCTAssertEqual(1, result.count);
NSManagedObject *obj = [result firstObject];
XCTAssertEqualObjects(([NSString stringWithFormat:@"%@ 1", e]),
[obj valueForKey:@"name"]);
}
}
}
還有一個函數來檢查某些實體是否在商店中(或不在)。
- (void)checkStore:(NSURL*)storeURL
model:(NSManagedObjectModel*)model
present:(NSArray*)present
notPresent:(NSArray*)notPresent {
@autoreleasepool {
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:model];
[psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:NULL];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.persistentStoreCoordinator = psc;
for (NSString *e in present) {
NSFetchRequest *fetchRequest = [NSFetchRequest
fetchRequestWithEntityName:e];
NSArray *result = [moc executeFetchRequest:fetchRequest error:NULL];
XCTAssertEqual(1, result.count);
NSManagedObject *obj = [result firstObject];
XCTAssertEqualObjects(([NSString stringWithFormat:@"%@ 1", e]),
[obj valueForKey:@"name"]);
}
for (NSString *e in notPresent) {
NSFetchRequest *fetchRequest = [NSFetchRequest
fetchRequestWithEntityName:e];
NSArray *result = [moc executeFetchRequest:fetchRequest error:NULL];
XCTAssertEqual(0, result.count);
}
}
}
而一個小幫手刪除URL
static void removeURL(NSURL ** url) {
[[NSFileManager defaultManager] removeItemAtURL:*url error:NULL];
}
和測試功能...
- (void)testConfigurations {
__attribute__((cleanup(removeURL))) NSURL * __autoreleasing dirURL =
[[[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:YES
error:NULL]
URLByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
[[NSFileManager defaultManager] createDirectoryAtURL:dirURL
withIntermediateDirectories:YES
attributes:nil
error:NULL];
NSManagedObjectModel *model = [self makeConfigurationModel];
NSURL *store1URL = [dirURL URLByAppendingPathComponent:@"store1"];
NSURL *store2URL = [dirURL URLByAppendingPathComponent:@"store2"];
[self setupDatabaseWithModel:model store1:store1URL store2:store2URL];
[self checkStore:store1URL
model:model
present:@[@"Foo", @"Bar"]
notPresent:@[@"Blarg", @"Baz"]];
[self checkStore:store2URL
model:model
present:@[@"Blarg", @"Baz"]
notPresent:@[@"Foo", @"Bar"]];
}
這是什麼型號的配置都是。 –
他們應該如何使用?這是一個類似於我的場景:http://blog.atwam.com/blog/2012/05/11/multiple-persistent-stores-and-seed-data-with-core-data其中建議使用兩種模式合併到一個NSPersistentStoreCoordinator中。 – DAN
我們中的一個人錯過了一些東西。 「種子」文件應該只包含Foo實體。當你說它包含「空」實體時,你是什麼意思?是否有一堆具有默認值或實體的實體?如果是這樣,也許你的設置不正確。你怎麼知道在「種子」文件中有Bar,Blarg和Baz實體?你如何獲得它你從「種子」數據庫中獲取所有「酒吧」實體?你確定你不只是混淆了模型定義每個實體的事實,而且數據庫中沒有實際的實體嗎? –