Односторонние отношения в базовых данных - PullRequest
1 голос
/ 10 апреля 2011

Каждый ресторан должен иметь широту и долготу. Однако каждый объект LatitudeLongitude не должен иметь «ресторан»

Итак, у меня есть односторонние отношения и я генерирую предупреждение компилятора.

В чем подвох?

Должен ли я использовать fetchRelationship вместо этого? Но что такое fetchRelationship?

Почему это так? Почему у него есть предикат? Почему это называется fetch? Я прочитал документацию и, похоже, не понял, что это такое на самом деле.

Ответы [ 2 ]

1 голос
/ 11 июля 2014

ОК, очень старый вопрос, но вот как бы я решил его сейчас.

Не все отношения должны быть заполнены. Сохраняйте свои обратные (двусторонние) отношения, но вам не обязательно связывать их.

+ (void)createRestaurantWithCompletion:(void (^)(BOOL, NSError *))completion {
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        Restaurant *localRestaurant;
        LatitudeLongitude *localLatLng1;
        LatitudeLongitude *localLatLng2;

        restaurant = [Restaurant MR_createInContext:localContext];

        localLatLng1 = [LatitudeLongitude MR_createInContext:localContext];
        localLatLng2 = [LatitudeLongitude MR_createInContext:localContext];

        restaurant.latLng = localLatLng1;
    }                 completion:completion];
}

К тому времени, когда вызывается completion, существуют и localLatLng1, и localLatLng2, один связан с рестораном, другой нет. Конечно, этот метод не имеет смысла в этой форме, он просто доказывает, что вы можете создавать объекты, не удовлетворяя их отношениям.

Z.

1 голос
/ 10 апреля 2011

Вы должны использовать извлеченные свойства (которые являются коллекцией управляемых объектов, удовлетворяющих указанному предикату извлечения) для представления односторонних отношений.Больше информации здесь .

Обновление

Возможно, вам следует использовать атрибуты в вашем случае, в противном случае вы бы добавили извлеченное свойство к сущности Restaurant, установив для ее целевого объекта значение LatitudeLongitudeи сохранить пары ключ-значение широты и долготы в его словаре userInfo.Его предикат выборки будет выглядеть так:

($FETCH_SOURCE.longitude LIKE [c] $FETCHED_PROPERTY.userInfo.longitude) AND ($FETCH_SOURCE.latitude LIKE [c] $FETCHED_PROPERTY.userInfo.latitude)
...