快速查询 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 数据库的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3 性能测试 - 如何快速重置/清除缓存

在fuelphp中查询数据库的更好方法是啥?

优化对只读sqlite数据库的快速访问?

FMDB/sqlite 查询函数问题

如何优化Mysql千万级快速分页

ThinkPHP3快速入门教程三:查询语言