【问题标题】:One Way Relationship in Core Data核心数据中的单向关系
【发布时间】:2011-04-10 07:56:33
【问题描述】:

每个餐厅都必须有纬度和经度。但是,每个 LatitudeLongitude 对象都不能有“餐厅”

所以我有一个单向关系并生成编译器警告。

有什么收获?

我应该改用 fetchRelationship 吗?但什么是 fetchRelationship?

为什么是一种方式?为什么它有谓词?为什么叫取?我阅读了文档,但似乎并没有得到它的真正含义。

【问题讨论】:

    标签: objective-c core-data relationship


    【解决方案1】:

    您应该使用获取的属性(它是满足指定获取谓词的托管对象的集合)来表示单向关系。更多信息here。

    更新

    您可能应该在您的情况下使用属性,否则您将向Restaurant 实体添加一个获取的属性,将其目标实体设置为LatitudeLongitude 并将纬度和经度键值对存储在其userInfo 字典中。它的 fetch 谓词如下所示:

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

    【讨论】:

    • 真的吗?但是 LatitudeLongitude 对象有什么谓词呢?
    • 真的,那么 LatitudeLongitude 对象应该有什么谓词?此外,每个 Restaurant 应该只有一个 LatitudeLongitude 对象。事实上,我可能应该把它作为一个属性而不是一个关系。不过,我只是好奇。
    • 你说得对,如果你不需要LatitudeLongitude 对象,不妨使用纬度和经度属性。如果您选择使用获取的属性,我已经更新了我的答案。
    • 谓词中的 [c] 是什么意思?
    • 它使比较不区分大小写。
    【解决方案2】:

    好的,超级老问题,但这是我现在要解决的方法。

    并非所有的关系都必须填补。保持反向(双向)关系,但不一定要链接它们。

    + (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.

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多