由于频繁更新,领域大数据库大小

时间:2016-09-26 21:27:59

标签: android realm

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

我正在活动realm.close()中使用onStop()关闭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(),因为db应该在你使用它时每秒更新一次,而且我只能关闭Realm { {1}}不onDestroy()(而onStop()要求您关闭所有领域)

感谢您的任何意见,谢谢!

1 个答案:

答案 0 :(得分:3)

我遇到了一个问题,即我的领域文件大小以惊人的速度增加,并且当应用程序在开发期间意外关闭时,这是一个不调用close()的问题。因此我的数据库文件(其中只有大约1k项)是10MB。正确关闭我的领域实例解决了问题,并将我的数据库文件大小减少到~300KB。真的,值得检查整个代码库,以确保实际上关闭所有领域实例。这很麻烦,但比用户抱怨存储空间不足更好;)

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

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

drealm.close();