В зависимости от того, как вы настраиваете свой базовый стек данных, прямо в его духе, убедитесь, что когда вы читаете NSManagedObjectModel (s), которые обычно создаются из NSBundle, у вас есть несколько действительных сущностей.Установите точку останова в своем проекте, где возвращается модель, а затем в вызове отладчика:
po [[managedObjectModel entitiesByName] allKeys]
Если это возвращает список сущностей, то я не совсем точно знаю, что происходит, но я подозреваю, чточто он вернет пустой список, потому что код не может найти никаких файлов мамы в вашем проекте.
Вот что я сделал, чтобы обойти это.В своем проекте статической библиотеки (или если ваша статическая библиотека - просто еще одна цель в вашем основном проекте), создайте новую цель NSBundle.Добавьте базовую модель данных и любые модели отображения, которые у вас есть, к этой цели.Затем добавьте его в качестве зависимости к вашей цели статической библиотеки и цели приложения.В своей основной цели приложения добавьте этот новый пакет в фазу сборки Copy Bundle Resources.
Затем в вашем стеке базовых данных вам просто нужно найти все пакеты для поиска моделей.У меня есть код, подобный следующему:
/**
Creates, retains, and returns the managed object model for the application
by merging all of the models found in the application bundle.
*/
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel) return managedObjectModel;
// Get all the bundles including ones nested inside the main bundle
NSMutableSet *allBundles = [NSMutableSet set];
NSMutableSet *newBundles = [NSMutableSet set];
NSUInteger numberOfBundles = 0;
[allBundles addObject:[NSBundle mainBundle]];
while (numberOfBundles < [allBundles count]) {
// Look for nested bundles
for(NSBundle *bundle in allBundles) {
NSArray *morePaths = [NSBundle pathsForResourcesOfType:@".bundle" inDirectory:[bundle bundlePath]];
if([morePaths count] > 0) {
for(NSString *bundlePath in morePaths) {
if(![allBundles containsObject:bundlePath])
[newBundles addObject:[NSBundle bundleWithPath:bundlePath]];
}
}
}
// Add the new bundles
[allBundles unionSet:newBundles];
numberOfBundles = [allBundles count];
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:[allBundles allObjects]] retain];
if (managedObjectModel) return managedObjectModel;
return nil;
}
Обратите внимание, что приведенный выше код не должен знать, как вы назвали свою модель.У меня есть эта функция в одноэлементном классе, который также создает постоянный координатор хранилища и возвращает MOC.Так эффективно, как только вы это сделали, у вас есть полностью общее использование в любом месте стека базовых данных, который вы можете создать из любого места в вашем приложении.
Я думаю, я мог бы опубликовать источник этого где-нибудь, если люди захотятЭто.В любом случае, надеюсь, что это поставит вас на правильный путь.