【问题标题】: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
  • 如您所见,我手动编辑图像。在我的模型中,它们是大写字母。

标签: ios objective-c core-data subquery nspredicate


【解决方案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。 最后,只需尝试重新创建数据库,但要小心您的数据。

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2012-08-20
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多