iCloud 中基于 SQLite 的核心数据中的有序关系

Posted

技术标签:

【中文标题】iCloud 中基于 SQLite 的核心数据中的有序关系【英文标题】:Ordered relationships in SQLite-based Core Data in iCloud 【发布时间】:2013-03-11 11:28:18 【问题描述】:

我有一个 ios 6.1 应用程序,它使用具有一些有序关系的 Core Data 模型。它的下一个版本应该支持 iCloud。但是,iCloud 不允许在基于 SQLite 的 Core Data 模型中使用ordered relationships。

Apple 对在这种情况下如何重构模型有任何建议,或者您是否获得了这方面的实践经验?我在 A 类和 B 类之间有一对多的关系,例如A1 到 B1、B2 和 A2 到 B2、B3,因此仅向 B 添加索引属性将无济于事。我可能必须引入一个与 A 和 B 一对一关系的新类 C(例如 C1 到 A1 和 B1),但如果可能的话,我想避免这种情况。

顺便说一句,如果我将原始核心数据模型与 iCloud 一起使用,我会遇到以下类型的多个错误消息,我认为这是由于存在有序关系:

ERROR:这个进程调用了一个NSArray-taken方法,比如 initWithArray:,并传入一个 NSSet 对象。这正在 暂时可以解决,但很快就会让你伤心。

【问题讨论】:

【参考方案1】:

我添加到名为 order 的对象属性。

我有一些与 FotoContent 对象具有“toMany”关系的对象。 FotoContent 具有名为“url”的属性和属性“order”。在我的项目中,我需要让它们按 url 名称排序。 所以让我们做这样的事情:

// 没有“复制”方法你会得到错误信息

NSMutableArray *fotosToOrder = [[[object fotos]  copy]mutableArrayValueForKey:@"url"];  
//sort new array by url attribute
[fotosToOrder sortUsingComparator:^NSComparisonResult(id obj1, id obj2) 
        NSComparisonResult res = [(NSString*) obj1 caseInsensitiveCompare:(NSString *) obj2];
        return res;
    ];

//go through all sorted urls and add Order value to Fotos objects
int order = 0;
for (NSString *sortedFotoURL in fotosToOrder)
    for (FotoContent *unsortedFoto in object.fotos)
       if ([sortedFotoURL isEqualToString:unsortedFoto.url])
            unsortedFoto.order = order;
            order++;
            break;
        
     

【讨论】:

+1 & thx,但是如果一张照片可以包含在多个订单中(如我的示例中:B2 包含在 A1 和 A2 中),这将无济于事。在这种情况下,您需要为每张照片存储超过属性值的订单,所以问题是如何做到这一点。毕竟,我目前倾向于添加像 OrderToFotos(或示例中的 C)这样的新类。

以上是关于iCloud 中基于 SQLite 的核心数据中的有序关系的主要内容,如果未能解决你的问题,请参考以下文章

在 icloud 中存储 sqlite 数据库?

将存储在 sqlite 中的用户数据迁移到应用升级中的核心数据

基于sqlite数据库

基于sqlite数据库

iCloud 核心数据未同步第二台设备上的所有记录

使用 iCloud 解决核心数据中的冲突