swift - 在 swift 中查询 sqlite 数据库的更好方法

标签 swift sqlite core-data

我正在玩文字游戏,并使用 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 数据库的很多值(value)。

有什么建议的方法可以更好地使用数据库吗?

非常感谢您的帮助!

最佳答案

要让数据库进行过滤(然后可以使用索引自动优化),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 = ?

关于swift - 在 swift 中查询 sqlite 数据库的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45559042/

相关文章:

swift - CBCentralManager 停止扫描需要多长时间?

iphone - 将 NSManagedObject 子类转换为协议(protocol)

core-data - 如何根据相关对象转换 SwiftUI 获取请求结果?

python - sqlite3.ProgrammingError : Incorrect number of bindings supplied. 当前语句使用1,并且提供了4个

android - 有助于为 Android 实现基于 SQLite 的持久性的工具?

Python & SQLite3 从两个表中选择

ios - Core Data 应该如何与我的 "unusual"对象一起使用?

ios - 如何确保每次添加新条目时都不会检索和追加数据?

swift - 无法快速调用两个不同类中的类方法

ios - 旧版本中的等效项是什么。当我在旧版本中运行时,该应用程序没有给我一个大的导航栏