关系属性的核心数据获取请求
Core data Fetch request on relationship properties
我的应用程序有多个单词列表,每个单词列表包含多个单词。在一个视图控制器中,tableView 列出了 wordLists,然后子视图控制器有一个 tableView,其中包含单词。 segue 传递 wordList 实体。但我不知道如何对传递给的 wordList 执行提取请求,然后获取所有单词。错误信息如下所示。我需要执行获取请求而不是查看属性,以便进行排序。
在此先感谢您对此的任何帮助....
WordList 实体有一个属性 listName,关系:单词,目标:单词,反向:wordList
Word 实体具有属性 wordName、wordIndex 和关系:wordList,目标:WordList,反向: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")
}
}
您不能使用字符串插值来构建谓词,请使用
代替参数替换。在你的情况下(因为 var wordList: WordList?
是一个
可选):
if let theWordlist = wordlist {
let wordListPredicate = NSPredicate(format: "wordList == %@", theWordlist)
} else {
// wordlist is nil ...
}
还要注意谓词中的"word.wordList == "
应该是
"wordList == "
,因为"wordList"是"Word"的属性
实体。
有关详细信息,请参阅 Predicate Format String Syntax
在 "Predicate Programming Guide".
您应该使用 NSFetchedResultsController
,而不是获取 viewDidLoad
中的所有数据。 fetched results controller 将帮助您高效地获取和显示数据、对更改做出反应、优化内存等。
在获取结果控制器的获取请求(获取实体 Word
)中,使用此谓词(如果您的可选 wordList
是 nil
,请使用保护措施):
request.predicate = wordList != nil ?
NSPredicate(format: "wordlist = %@", wordList!) :
NSPredicate(value: false)
这假设单词列表与其单词之间存在一对多关系。我会推荐这个设置,即使它意味着如果同一个词在不同的列表中,你可能不得不多次存储它。
注意:假谓词确保您获得有效的获取请求,但不会获取任何内容。
我的应用程序有多个单词列表,每个单词列表包含多个单词。在一个视图控制器中,tableView 列出了 wordLists,然后子视图控制器有一个 tableView,其中包含单词。 segue 传递 wordList 实体。但我不知道如何对传递给的 wordList 执行提取请求,然后获取所有单词。错误信息如下所示。我需要执行获取请求而不是查看属性,以便进行排序。
在此先感谢您对此的任何帮助....
WordList 实体有一个属性 listName,关系:单词,目标:单词,反向:wordList
Word 实体具有属性 wordName、wordIndex 和关系:wordList,目标:WordList,反向: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")
}
}
您不能使用字符串插值来构建谓词,请使用
代替参数替换。在你的情况下(因为 var wordList: WordList?
是一个
可选):
if let theWordlist = wordlist {
let wordListPredicate = NSPredicate(format: "wordList == %@", theWordlist)
} else {
// wordlist is nil ...
}
还要注意谓词中的"word.wordList == "
应该是
"wordList == "
,因为"wordList"是"Word"的属性
实体。
有关详细信息,请参阅 Predicate Format String Syntax 在 "Predicate Programming Guide".
您应该使用 NSFetchedResultsController
,而不是获取 viewDidLoad
中的所有数据。 fetched results controller 将帮助您高效地获取和显示数据、对更改做出反应、优化内存等。
在获取结果控制器的获取请求(获取实体 Word
)中,使用此谓词(如果您的可选 wordList
是 nil
,请使用保护措施):
request.predicate = wordList != nil ?
NSPredicate(format: "wordlist = %@", wordList!) :
NSPredicate(value: false)
这假设单词列表与其单词之间存在一对多关系。我会推荐这个设置,即使它意味着如果同一个词在不同的列表中,你可能不得不多次存储它。
注意:假谓词确保您获得有效的获取请求,但不会获取任何内容。