android - 由于频繁更新, Realm 大数据库大小

标签 android realm

我有一个线程每秒运行一次,每秒更新 Realm 数据库字段。虽然正在更新的数据很小,但我发现更新仍然会增加数据库文件的大小,直到您使用 Realm.compressRealm() 明确清理它,所以在一两个小时内数据库大小为 50MB+ 并且也会在短时间内轻松膨胀到 750MB 以上。

我在 Activity onStop() 中使用 realm.close() 关闭 Realm,同时关闭我在计时器线程中创建的新 Realm 实例:

public void checkDealersTimer() {
    RealmResults<Dealers> dealersLookup = realm.where(Dealers.class).equalTo("thedealers","thedealers").findAll();
    dlr = dealersLookup.get(0);

    if (dlr.getPerSecond() != 0.00) {
        if (dealerTimer == null) {
            dealerTimer = new Timer();
            dealerTimer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    Realm drealm;
                    drealm = Realm.getDefaultInstance();

                    RealmResults<Dealers> dealersLookup = drealm.where(Dealers.class).equalTo("thedealers","thedealers").findAll();
                    dlr = dealersLookup.get(0);

                    drealm.beginTransaction();
                    dlr.setEarnings(dlr.getEarnings()+dlr.getPerSecond());
                    drealm.commitTransaction();
                    drealm.close();
                }
            }, 0, 1000);

        }
    }
}

这个计时器是我唯一在 UI 线程之外使用 Realm 的地方,也是我唯一如此频繁更新的地方,所以我假设“泄漏”来自这里,尽管我不能确定。无论应用程序是否可见,文件大小都会逐渐增加,但只有在它运行时才会增加。

这是另一个有类似问题的用户: App size increase due to realm android

如果这被认为是解决方案,我找不到调用 Realm.compressRealm() 的正确方法,因为当您使用它时,数据库应该每秒更新一次,并且我只能关闭 Realm onDestroy() 而不是 onStop()(并且 Realm.compressRealm() 要求您关闭所有 Realms)

感谢任何意见,谢谢!

最佳答案

我有一个问题,我的 Realm 文件大小以惊人的速度增加,这是一个问题,当应用程序在开发过程中意外关闭时,没有调用 close()。因此,我的数据库文件(其中只有大约 1k 个项目)为 10MB。正确关闭我的 Realm 实例解决了问题并将我的数据库文件大小减少到 ~300KB。确实,值得检查您的整个代码库以确保您确实关闭了所有 Realm 实例。这很烦人,但比让用户提示存储空间不足要好得多;)

根据您上面的示例,我还建议使用 realm 提供的 executeTransaction 方法(而不是开始/提交事务):

drealm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        dlr.setEarnings(dlr.getEarnings() + dlr.getPerSecond());
    }
});

drealm.close();

关于android - 由于频繁更新, Realm 大数据库大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39712701/

相关文章:

android - 想要 ListActivity 的 setEmptyView()

java - 如何正确保存包含RealmList的对象?

ios - fatal error : use of unimplemented initializer 'init(realm:schema:)' for class MyApp. 用户

realm - 如何在 Realm Swift 中自定义 getter 和 setter?

ios - RealmSwift - 交易完成

android - 减少本地数据库中的数据库请求

android - 如何给 ActionBar 中的图标添加文字?

java - 自动引用 Android 布局组件

php - 如何对从 phpMyAdmin 获取数据的 ListView 进行排序

android - AndroidX 中的 BottomSheetBehavior