如何使用Realm提高大型数据集的性能?

时间:2016-07-13 12:39:43

标签: swift realm

我的数据库有500,000条记录。表格没有主键,因为Realm不支持复合主键。我在后台线程中获取数据,然后我想在主线程的UI中显示它。但由于Realm对象无法跨线程共享,因此无法使用我在后台获取的记录。相反,我需要重新获取主线程上的记录?如果我从500,000条记录中取出一条记录,它将阻止主线程。我不知道如何处理它。我使用Realm因为它说它足够快。如果我需要多次重新获取记录,它真的比SQLite快吗?我不想创建另一个将其他列组合为主键的属性,因为Realm数据库已经大于SQLite文件。

CrmConnection

然后我将获取的记录存储在Array

@objc class CKPhraseModel: CKBaseHMMModel{
    dynamic var pinyin :String!
    dynamic var phrase :String = ""

    class func fetchObjects(apinyin :String) -> Results<CKPhraseModel> {

        let realm = Realm.createDefaultRealm()

        let fetchString = generateQueryString(apinyin)
        let phrases = realm.objects(self).filter(fetchString).sorted("frequency", ascending: false)

        return phrases
    }

    func save(needTransition :Bool = true) {

        if let realm = realm {
            try! realm.write(needTransition) {[unowned self] in
                self.frequency += 1
            }
        }
        else {
            let realm = Realm.createDefaultRealm()
            if let model = self.dynamicType.fetchObjects(pinyin).filter("phrase == %@", phrase).first {
                try! realm.write(needTransition) {[unowned self] in
                    model.frequency += self.frequency
                }
            }
            else {
                try! realm.write(needTransition) {[unowned self] in
                    realm.add(self)
                }
            }
        }
    }
}

然后,当用户点击其中一个时,我想在UI中显示let userInput = "input somthing" let phraseList = CKPhraseModel().fetchObjects(userInput) for (_,phraseModel) in phraseList.enumerate() { candidates.append(phraseModel) } 信息。我将调用CKPhraseModel的candidates函数来保存更改。这一步是在主线上。

1 个答案:

答案 0 :(得分:1)

如果你使用延迟加载功能,Realm会很快,这意味着你创建了一个直接从Realm返回[Illuminate\Database\QueryException] SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'Ollie@positivelearning.com' for key 'users_email_unique' (SQL: insert into `users` (`email`, `password`, `username`, `updated_at`, `created_at`) values (Ollie@positivelearning.com, y$rx8R0N5dVAibjpXxV0OF4uGGb7lradsl2xME 20ymMvv2YPaUWv3oq, olliepritsak, 2016-07-14 18:10:10, 2016-07-14 18:10:10)) [PDOException] SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'users_username_unique' 的过滤器,因为那样你只需要检索你的元素结果中的索引。

在您的情况下,您复制所有元素。这有点慢,这就是为什么你最终冻结。