Отношения перекрестные модели в NSManagedObjectModel из объединенных моделей?

Это может быть что угодно, но, скорее всего, причина в следующем:

Ваши переменные 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 для обоих.

9
задан TechZen 8 March 2010 в 18:28
поделиться

1 ответ

Ни модель 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 — можно использовать приемы как это для повреждения модели в многоуровневые модели.

16
ответ дан 4 December 2019 в 13:06
поделиться