【问题标题】:Is it possible to return only the desired objects in Core Data是否可以在 Core Data 中只返回所需的对象
【发布时间】:2015-07-04 06:52:27
【问题描述】:

我有两个实体

书 - 属性:名称,描述 - 关系:类型为 To Many 的 book 到 BookLang(逆:bookLang)

BookLang - 属性:nameLang、descLang、lang - 关系:bookLang,类型为 To One to Book(逆:book)

在 BookLang 中有两个对象用于 fr,de 语言 如果我使用

let lang = "fr"
let pre = NSPredicate(format: "book.lang == %@", lang);
Then I have to loop through the fetchResult and then loop through the book NSSet

for b in bookSet {

    let lan = b.valueForKey("lang") as! String
        if(lan == lang){
        let name = b.valueForKey("nameLang") as! String
        println(name) // the book title in french
        break;
    }                  

}

我如何才能在书 NSSet 中只获取我想要的对象

我试试

let subPre = NSPredicate(format: "SUBQUERY(BookLang, $s, $s.lang == %@)", lang);

有错误

Unable to parse the format string "SUBQUERY(BookLang, $s, $s.lang == %@)"'

【问题讨论】:

    标签: swift core-data predicate


    【解决方案1】:

    保持简单。关系、循环、子查询 - 都是不必要的!

    一个简单的字符串属性lang怎么样?

    let frenchBooks = allBooks.filteredSetUsingPredicate(NSPredicate(format: "lang = %@", "fr"))
    

    或者,以真正的 Swift 方式

    let frenchBooks = allBooks.filter() { $0.lang = "fr" }
    

    【讨论】:

    • 非常感谢,我不知道filteredSetUsingPredicate。顺便说一句,我如何使这个查询起作用 let predicateLang = NSPredicate(format: "ANY book.lang =[cd] %@ AND book.nameLang contains [c] %@", "fr", "someString")。我在 nameLang 和 lang = fr 中搜索给定的字符串,这应该返回 false,但它没有
    • 您忘记了nameLang 已过时。 NSPredicate(format:"lang = 'fr' && name contains[cd] %@", searchString).
    • 这行不通,因为 lang 是 BookLang 的一部分。我正在使用 ANY book.lang =[cd] %@ AND book.nameLang contains [cd] %@ 但是我必须过滤返回的集合
    【解决方案2】:

    为什么要创建谓词而不使用?
    要获取所有符合条件的书籍,您可以针对核心数据上下文使用获取请求。

        let fetchRequest = NSFetchRequest(entityName: "Book") //supposing that you managed object subclass is named Book
        fetchRequest.predicate = NSPredicate(format: "lang == %@", lang);
        if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [Book] {
    //DO what you want
        }
    


    这只是一个 sn-p,你应该用 error 和 else 语句来完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多