我有一个线程每秒运行一次,每秒更新 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/