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

时间:2017-08-08 03:57:54

标签: 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,这意味着我不能直接使用结果(例如get resultFilteredByPredicate.word)。

此外,感觉我可能会以错误的方式解决这个问题。因为一切都必须首先进入数组,所以我必须首先失去使用sqlite数据库的许多价值。

任何建议的方法可以更好地使用数据库?

非常感谢您的任何帮助!

1 个答案:

答案 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 = ?