我正在开发文字游戏,并使用sqlite数据库捆绑了完整的英文单词列表。我试图找到在数据库中搜索给定字符串的最佳方法,以确定它是否为单词。
此时我可以将整个数据库放到一个数组中:
func fetchWords() {
if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext {
let wordsFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "EnglishWord")
do {
englishWords = try managedObjectContext.fetch(wordsFetch) as! [EnglishWord]
print(englishWords[123323].word)
//Prints "injustices"
} catch {
//error handling
}
}
}
现在。我真正想做的是传入给定的字符串,看看它是否存在于我的数据库中。我有一个带谓词的笨重解决方案,例如:
func fetchWordsToArray() {
if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext {
let wordsFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "EnglishWord")
let searchWord = ["dastardly"]
let searchPredicate = NSPredicate(format: "word = %@", argumentArray: searchWord)
do {
englishWords = try managedObjectContext.fetch(wordsFetch) as! [EnglishWord]
let resultFilteredByPredicate = (englishWords as NSArray).filtered(using: predicate)
print(resultFilteredByPredicate)
} catch {
//error handling
}
}
}
但是为了使用过滤后的函数,我必须转换为NSArray,这意味着我不能直接使用结果(例如get resultFilteredByPredicate.word)。
此外,感觉我可能会以错误的方式解决这个问题。因为一切都必须首先进入数组,所以我必须首先失去使用sqlite数据库的许多价值。
任何建议的方法可以更好地使用数据库?
非常感谢您的任何帮助!
答案 0 :(得分:1)
要使数据库执行过滤(然后可以使用索引自动优化),put a predicate on the original fetch request:
let formatRequest : NSFetchRequest<Word> = Word.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "word == %@", searchWord)
let fetchedResults = try context.fetch(fetchRequest) as! [Word]
但核心数据是管理对象的框架。 如果您确定您的单词不是对象而只是值,则可以将Core Data替换为直接执行SQL的其他库,并执行SQL查询:
SELECT * FROM EnglishWord WHERE word = ?