首页 文章

核心数据获取关系属性的请求

提问于
浏览
1

我的应用程序有许多单词列表,每个单词列表包含许多单词 . 在一个视图控制器中,tableView列出了wordLists,然后子视图控制器有一个tableView,其中包含单词 . segue传递wordList实体 . 但是我无法弄清楚如何对传递到的wordList执行获取请求然后获取所有单词 . 错误消息如下所示 . 我需要做一个获取请求,而不是查看属性,所以我可以做一个排序 .

提前感谢您对此的任何帮助....

WordList实体具有属性listName和关系:words,destination:Word,Inverse:wordList

Word实体具有属性wordName,wordIndex和relationships:wordList,destination:WordList,Inverse:words

我的WordsViewController看起来像:

class WordsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate  {

var coreDataStack: CoreDataStack = (UIApplication.sharedApplication().delegate as! AppDelegate).coreDataStack

var wordList: WordList?
var words = [Word]()
var word: Word?

override func viewDidLoad() {
    super.viewDidLoad()

    // set the title of the scene
    title = wordList?.listName

   // fetch all the words that are part of the wordList passed to this VC.
   let fetchRequest = NSFetchRequest(entityName: "Word")
    let wordListPredicate = NSPredicate(format: "word.wordList == '\(wordList)'") // GIVES AN ERROR SAYING UNABLE TO PARSE THE FORMAT STRING "word.wordList == 'Optional(<WordList:0x...

    let sortDescriptor = NSSortDescriptor(key: "wordIndex", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]

    fetchRequest.predicate = wordListPredicate

    do {
        if let results = try coreDataStack.managedObjectContext.executeFetchRequest(fetchRequest) as? [Word] {
            words = results
        }
    } catch {
        fatalError("There was an error fetching system person")
    }  
}

2 回答

  • 0

    您不能使用字符串插值来构建谓词,而是使用参数替换 . 在你的情况下(因为 var wordList: WordList? 是可选的):

    if let theWordlist = wordlist {
        let wordListPredicate = NSPredicate(format: "wordList == %@", theWordlist)
    } else {
        // wordlist is nil ...
    }
    

    另请注意,谓词中的 "word.wordList == " 应为 "wordList == " ,因为"wordList"是"Word"实体的属性 .

    有关更多信息,请参阅"Predicate Programming Guide"中的Predicate Format String Syntax .

  • 0

    您应该使用 NSFetchedResultsController ,而不是获取 viewDidLoad 中的所有数据 . 获取的结果控制器将帮助您有效地获取和显示数据,对更改做出反应,优化内存等 .

    在获取结果控制器的获取请求(获取实体 Word )中,使用此谓词(如果您的可选 wordListnil ,则使用安全措施):

    request.predicate = wordList != nil ?
      NSPredicate(format: "wordlist = %@", wordList!) :
      NSPredicate(value: false)
    

    这假定单词列表与其单词之间存在 one-to-many 关系 . 我建议使用此设置,即使它意味着如果它位于不同的列表中,您可能不得不多次存储相同的单词 .

    注意:false谓词可确保您获得有效的获取请求,该请求将不会获取任何内容 .

相关问题