iOS:魔法记录的 NSPredicate 问题?
iOS: NSPredicate Issue with Magical Record?
我的应用程序从服务器下载对象,并使用 Magical Record 将每个项目添加到核心数据中。我不想每次都删除每个对象并重新下载所有内容,而是只想下载新项目(我已经弄清楚了这部分),并检查服务器上的对象(解析)是否已被删除,从而在本地删除它们以同步它(这是我遇到的麻烦)。
我想做的是获取存储在 Core Data 中的所有对象,并使用 NSPredicate 过滤器从 Core Data 中获取存在于该本地数组中但不存在于检索到的对象中的项目数组(这表明它们已在服务器上被删除...我正在使用 Parse),所以我想删除它们。
这就是我正在做的事情:
//Fetch local objects from core data (objects is an array returned by the server)
NSPredicate *deletedObjectsOnServer = [NSPredicate predicateWithFormat:@"NOT (objectId IN %@)", objects];
NSArray *localObjectsArray = [MyObject MR_findAllWithPredicate:deletedObjectsOnServer];
NSLog(@"Deleted Files on server: %@", localObjectsArray);
问题是我收到以下错误:
*Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'unimplemented SQL generation for predicate : (objectId IN
{<MyObject:0x156e8210, objectId: WXwBOQ73KS, localId: (null)>*
您的 objects
数组似乎包含 MyObject
的一个实例,而在谓词中您希望通过 objectId
属性 进行过滤,这(可能)是 NSString
。
更改传递给 NSPredicate
的数组以包含 objectId
值应该可以解决问题:
NSPredicate *deletedObjectsOnServer = [NSPredicate predicateWithFormat:@"NOT (objectId IN %@)", [objects valueForKey:@"objectId"]];
我的应用程序从服务器下载对象,并使用 Magical Record 将每个项目添加到核心数据中。我不想每次都删除每个对象并重新下载所有内容,而是只想下载新项目(我已经弄清楚了这部分),并检查服务器上的对象(解析)是否已被删除,从而在本地删除它们以同步它(这是我遇到的麻烦)。
我想做的是获取存储在 Core Data 中的所有对象,并使用 NSPredicate 过滤器从 Core Data 中获取存在于该本地数组中但不存在于检索到的对象中的项目数组(这表明它们已在服务器上被删除...我正在使用 Parse),所以我想删除它们。
这就是我正在做的事情:
//Fetch local objects from core data (objects is an array returned by the server)
NSPredicate *deletedObjectsOnServer = [NSPredicate predicateWithFormat:@"NOT (objectId IN %@)", objects];
NSArray *localObjectsArray = [MyObject MR_findAllWithPredicate:deletedObjectsOnServer];
NSLog(@"Deleted Files on server: %@", localObjectsArray);
问题是我收到以下错误:
*Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'unimplemented SQL generation for predicate : (objectId IN
{<MyObject:0x156e8210, objectId: WXwBOQ73KS, localId: (null)>*
您的 objects
数组似乎包含 MyObject
的一个实例,而在谓词中您希望通过 objectId
属性 进行过滤,这(可能)是 NSString
。
更改传递给 NSPredicate
的数组以包含 objectId
值应该可以解决问题:
NSPredicate *deletedObjectsOnServer = [NSPredicate predicateWithFormat:@"NOT (objectId IN %@)", [objects valueForKey:@"objectId"]];