【问题标题】:Custom Object IN NSSet NSPredicate with SQL使用 SQL 的 NSSet NSPredicate 中的自定义对象
【发布时间】:2014-10-22 23:03:23
【问题描述】:

NSManagedObject 有一个作为 Transformable 的属性,我用它来存储一个 NSMutableOrderedSet。

该集合包含自定义对象(不是 NSManagedObject 的子类),它们实现 NSCoding 并覆盖 isEqual: 和 hash 方法。

我有一个 NSPredicate 来检查这个集合是否包含一个传递的对象。

谓词基本上就是这个:

[NSPredicate predicateWithFormat:@"%@ IN %K", theObjectToCheck, @"propertyNameForTheSet"];

它适用于内存中的数据库,但使用 SQL 会引发 BAD ACCESS 错误。

我已启用所有诊断。

sql 调试是这样的:

CoreData: sql: SELECT COUNT( DISTINCT t0.Z_PK) FROM ZIMPLEMENTED_ABSTRACT_ENTITY_NAME t0 WHERE ( NSCoreDataStringSearch( t0.ZPROPERTYNAMEFORTHESET1, ?, 0, 0) AND  t0.Z_ENT = ?) 
CoreData: details: SQLite bind[0] = theObjectToCheckAsString(not-hash)
CoreData: details: SQLite bind[1] = 6

堆栈跟踪是:

0   ???                                 0x00000001eee4d8dc 0x0 + 8302942428,
1   Spatch                              0x00000001020d5ee0 main + 0, 
2   CoreData                            0x000000010386ee26 _NSCoreDataStringSearch + 246,
3   libsqlite3.dylib                    0x0000000107337384 sqlite3VdbeExec + 16100,
4   libsqlite3.dylib                    0x000000010728e4ff sqlite3_step + 527,
5   CoreData                            0x0000000103820070 _execute + 112,
6   CoreData                            0x000000010381fd0b -[NSSQLiteConnection execute] + 1835,
7   CoreData                            0x0000000103879b18 -[NSSQLChannel selectCountWithFetchRequest:] + 168,
8   CoreData                            0x00000001038796b5 -[NSSQLCore countForFetchRequest:inContext:] + 405,
9   CoreData                            0x0000000103825f01 -[NSSQLCore executeRequest:withContext:error:] + 513,
10  CoreData                            0x00000001038fb4f3 __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 3331,
11  CoreData                            0x00000001039037ee gutsOfBlockToNSPersistentStoreCoordinatorPerform + 190,
12  libdispatch.dylib                   0x00000001056b17f4 _dispatch_client_callout + 8,
13  libdispatch.dylib                   0x0000000105698774 _dispatch_barrier_sync_f_invoke + 365,
14  CoreData                            0x00000001038f63d5 _perform + 197,
15  CoreData                            0x0000000103825ac8 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 504,
16  CoreData                            0x0000000103878c80 -[NSManagedObjectContext(_NSInternalAdditions) _countWithNoChangesForRequest:error:] + 288,
17  CoreData                            0x000000010387868b -[NSManagedObjectContext countForFetchRequest:error:] + 331,

似乎与:http://markmail.org/message/7cuuamyc4gcid5bb#query:+page:1+mid:h2t4o4moib3emltb+state:results 有相似之处

可以在此处查看示例项目:https://dl.dropboxusercontent.com/u/2935618/CustomObjectsInCoreData.zip

有什么想法可以让我深入了解这一点吗?非常感谢!

【问题讨论】:

  • 我 99% 确定这是不可能的,如果是这样,性能将非常糟糕。有什么理由不能为有序集中的对象建立适当的核心数据实体和适当的关系?
  • 是的,如果自定义对象扩展了nsmanagedobject,并且通过关系连接,我可以搜索它。有点惊讶我无法在包含一组字符串的属性中搜索字符串。

标签: sql debugging core-data nspredicate nsset


【解决方案1】:

如果这些对象不是实体并且没有通过核心数据模型中的显式关系连接,则似乎无法使用 SQL 搜索 NSPredicate 中的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多