Это может быть что угодно, но, скорее всего, причина в следующем:
Ваши переменные process.ENV, используемые в локальной среде, не будут работать в Heroku.
В Heroku вы должны установить все переменные process.ENV следующим образом:
heroku config:set FIREBASE_DATABASE_URL='https://abcd.firebaseio.com'
Если у вас есть больше переменных process.ENV, вы можете установить все добавляемое пространство в конце:
heroku config:set FIREBASE_DATABASE_URL='https://abcd.firebaseio.com' FIREBASE_API_KEY: '1234' FIREBASE_AUTH_DOMAIN: 'abc'
Или вы можете сделать это в Heroku Dashboard:
Посмотрите на эту веб-страницу Heroku для обоих.
Ни модель 1, ни модель 2 не будут загружаемыми во время выполнения, если они не будут правильно построены — то есть, если toBar
и toFoo
отношения имеют места назначения. Кроме того, если модель 1 и модель 2 тождественно назвали модели, Вы не сможете создать объединенную модель от них; они не будут объединены, они столкнутся, который является ошибкой.
Однако можно использовать NSManagedObjectModel
API вручную, чтобы загрузить каждую модель и создать новую модель вручную, которая содержит объекты от обоих. NSEntityDescription
и NSPropertyDescription
классы (и его подклассы) действительно реализуют NSCopying
протокол так в большинстве случаев необходимо просто смочь скопировать свойства от каждой компонентной модели до полной модели.
Кроме того, NS*Description
классы вся поддержка a userInfo
словарю, который можно отредактировать в инструменте моделирования данных XCode, который можно использовать, чтобы сделать вещи, нравится, отмечают место назначения отношений как заместитель. Например, в модели 1 у Вас мог быть a Bar
объект с a userInfo
ключ MyRealEntity
и проверьте на это при создании объединенной модели как сигнал использовать реальный объект вместо этого.
Вы также захотите поместить заместителя обратных связей в Вашего заместителя объектов; они будут заменены реальными инверсиями после слияния. Вы не должны полностью копировать своего заместителя объектов во всех моделях, хотя; Вам только нужны обратные связи, используемые в Вашей реальной модели в стенде в объекте.
Таким образом, если Ваше реальное Foo
имеет a name
атрибут и Ваша реальная Панель имеют a kind
атрибут, Ваше благоприятное положение Foo
и Bar
не будет нуждаться в них, просто заместитель toBar
и toFoo
отношения.
Вот некоторый код, демонстрирующий, о чем я говорю:
- (NSManagedObjectModel *)mergeModelsReplacingDuplicates:(NSArray *)models {
NSManagedObjectModel *mergedModel = [[[NSManagedObjectModel alloc] init] autorelease];
// General strategy: For each model, copy its non-placeholder entities
// and add them to the merged model. Placeholder entities are identified
// by a MyRealEntity key in their userInfo (which names their real entity,
// though their mere existence is sufficient for the merging).
NSMutableArray *mergedModelEntities = [NSMutableArray arrayWithCapacity:0];
for (NSManagedObjectModel *model in models) {
for (NSEntityDescription *entity in [model entities]) {
if ([[entity userInfo] objectForKey:@"MyRealEntity"] == nil) {
NSEntityDescription *newEntity = [entity copy];
[mergedModelEntities addObject:newEntity];
[newEntity release];
} else {
// Ignore placeholder.
}
}
}
[mergedModel setEntities:mergedModelEntities];
return mergedModel;
}
Это работает потому что копирование NS*Description
объекты в Базовых Данных являются прозвищем, а не значением относительно целевого объекта и инверсии отношений (и к подобъектам объекта также). Таким образом, в то время как модель изменяема — то есть, прежде чем она будет установлена как модель для NSPersistentStoreCoordinator
— можно использовать приемы как это для повреждения модели в многоуровневые модели.