快速查询 sqlite 数据库的更好方法
Posted
技术标签:
【中文标题】快速查询 sqlite 数据库的更好方法【英文标题】:Better approach to querying sqlite database in swift 【发布时间】:2017-08-08 03:57:53 【问题描述】:我正在开发一个文字游戏,并使用 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,这意味着我不能直接处理结果(例如获取 resultFilteredByPredicate.word)。
而且感觉我可能会以错误的方式处理这一切。因为一切都必须先进入一个数组,我必须首先失去使用 sqlite 数据库的很多价值。
有什么建议的方法可以更好地使用数据库吗?
非常感谢您的帮助!
【问题讨论】:
根据您发布的代码,这不是 SQLite 问题,而是核心数据问题。 有道理。刚刚添加 core-data 作为标签。谢谢 【参考方案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 的库替换 Core Data,并改为执行 SQL 查询:
SELECT * FROM EnglishWord WHERE word = ?
【讨论】:
您好,感谢 CL 的回复。我把这一点牢记在心“但是 Core Data 是一个管理对象的框架。如果你认为你的词不是对象而只是值,你可以用其他一些直接执行 SQL 的库替换 Core Data”并最终使用 SQLite。 swift 感觉更适合我的需要。再次感谢!以上是关于快速查询 sqlite 数据库的更好方法的主要内容,如果未能解决你的问题,请参考以下文章