核心数据子查询:没有这样的列

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 做同样的事情,谢谢

【问题讨论】:

实体名称应为大写字母。例如PhoneContact 如您所见,我手动编辑图像。在我的模型中,它们是大写字母。 【参考方案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。 最后,只需尝试重新创建数据库,但要小心您的数据。

【讨论】:

以上是关于核心数据子查询:没有这样的列的主要内容,如果未能解决你的问题,请参考以下文章

子查询-列子查询

mysql子查询

子查询(章节摘要)

Oracle-查询,,..

子查询谓词核心数据

SQL练习 高级子查询