核心数据子查询:没有这样的列
Posted
技术标签:
【中文标题】核心数据子查询:没有这样的列【英文标题】:Core Data SUBQUERY: no such column 【发布时间】:2015-03-11 14:12:49 【问题描述】:NSFetcheRequest
中使用的谓词有问题。
我想让所有联系人至少拥有phone.internationalNumber == phoneNumberToCompareWith
。
这是我正在使用的谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(contact.phones, $phone, $phone.internationalNumber == %@).@count != 0",phoneNumberToCompareWith];
我收到错误:
2015-03-11 14:54:17.041 appName[1370:390550] 核心数据:错误: -executeRequest:遇到异常 = 数据库的 I/O 错误 /var/mobile/Containers/Data/Application/F262488E-30BA-414E-979A-D316F53041C3/Documents/appName.sqlite。 SQLite 错误代码:1,“没有这样的列:t2.ZINTERNATIONALNUMBER” 用户信息 = NSFilePath = "/var/mobile/Containers/Data/Application/F262488E-30BA-414E-979A-D316F53041C3/Documents/appName.sqlite"; NSSQLiteErrorDomain = 1;
实体关系:
[编辑]:这个谓词完成了:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ in contact.phones.internationalNumber)", phoneNumberToCompareWith];
但由于我从不使用 SUBQUERY 可以告诉我如何使用 SUBQUERY 做同样的事情,谢谢
【问题讨论】:
实体名称应为大写字母。例如Phone
、Contact
等
如您所见,我手动编辑图像。在我的模型中,它们是大写字母。
【参考方案1】:
您可以通过以下方式进行操作:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY contact.phones.internationalNumber = %@", phoneNumberToCompareWith];
子查询等价于:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(contact.phones, $x, $x.internationalNumber = %@).@count!=0", phoneNumberToCompareWith];
所以你的子查询是正确的。我建议您手动打开 sqlite 文件并检查数据结构。
大概是路径:
/var/mobile/Containers/Data/Application/F262488E-30BA-414E-979A-D316F53041C3/Documents/appName.sqlite
之后打开 sql 调试到你的目标,看看 Core Data 到底发送了什么到 sqlite。
产品 -> 方案 -> 编辑 添加“-com.apple.CoreData.SQLDebug 1”
尝试直接在您的数据库上运行 sqlite3 中有问题的 sql。 最后,只需尝试重新创建数据库,但要小心您的数据。
【讨论】:
以上是关于核心数据子查询:没有这样的列的主要内容,如果未能解决你的问题,请参考以下文章