我的应用程序有许多单词列表,每个单词列表包含许多单词。在一个视图控制器中,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")
}
}
答案 0 :(得分:0)
你不能使用字符串插值来构建谓词,使用
改为参数替换。在你的情况下(因为if let theWordlist = wordlist {
let wordListPredicate = NSPredicate(format: "wordList == %@", theWordlist)
} else {
// wordlist is nil ...
}
是一个
可选):
"word.wordList == "
还要注意谓词中的"wordList == "
https://storage.googleapis.com/" + bucket + "/" + objectName
,因为&#34; wordList&#34;是&#34; Word&#34;
实体。
有关详细信息,请参阅this article 在&#34;谓词编程指南&#34;。
答案 1 :(得分:0)
您应使用NSFetchedResultsController
,而不是viewDidLoad
中的所有数据。获取的结果控制器将帮助您有效地获取和显示数据,对更改做出反应,优化内存等。
在提取的结果控制器的提取请求(提取实体Word
)中,使用此谓词(如果您的可选wordList
为nil
,则设置安全措施):
request.predicate = wordList != nil ?
NSPredicate(format: "wordlist = %@", wordList!) :
NSPredicate(value: false)
这假设单词列表与其单词之间存在一对多关系。我建议使用此设置,即使它意味着如果它位于不同的列表中,您可能不得不多次存储相同的单词。
注意:false谓词可确保您获得有效的获取请求,该请求将不会获取任何内容。