2016-09-26 2 views
0

У меня поток, выполняемый каждую секунду, который обновляет поля базы данных Realm каждую секунду. Хотя обновляемые данные крошечные, я обнаружил, что обновления по-прежнему увеличивают размер файла базы данных до тех пор, пока вы явно не очистите его с помощью Realm.compressRealm(), поэтому в течение часа или двух размер db равен 50 Мбайт + и будет легко раздуваться до 750 МБ + за короткий период времени Что ж.Realm большой размер db из-за частых обновлений

Я закрываю Сферу с realm.close() в деятельности onStop(), а также закрытие нового 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); 

     } 
    } 
} 

Этот таймером является единственным местом, я использую Realm вне потока пользовательского интерфейса , и единственное место, где я делаю обновления настолько частыми, поэтому я предполагаю, что «утечка» исходит отсюда, хотя я не могу быть уверен. Размер файла становится видимым или нет, но только при его запуске.

Вот еще один пользователь с аналогичным вопросом: App size increase due to realm android

Если, как полагают, решение, я не могу найти правильный способ вызова Realm.compressRealm(), так как БД предполагается обновлять каждый второй, когда вы используя его, и я могу закрыть только Сферу onDestroy() не onStop()Realm.compressRealm() требует, чтобы закрыть все Realms)

Я ценю любой вклад, спасибо!

+0

Если вы закрыли экземпляр Realm после использования (особенно те, которые были в потоке non-looper, поскольку они не будут обновляться и блокируются специальной версией данных навсегда), обычно нет необходимости называть ' compactRealm() 'и размер файла не будет слишком большим. Поэтому взгляните на ответ @oddmeter. – beeender

ответ

2

У меня была проблема, когда размер файла моего царства увеличивался с угрожающей скоростью, и проблема заключалась в том, что вы не вызывали close(), когда приложение неожиданно закрывалось во время разработки. Таким образом, у моего файла базы данных (всего около 1 тыс. Элементов в нем) было 10 МБ. Правильное закрытие моего экземпляра области разрешило проблему и уменьшило размер моего файла базы данных до ~ 300 КБ. Действительно, стоит проверить всю вашу кодовую базу, чтобы убедиться, что вы фактически закрываете все экземпляров объектов. Это раздражает, но путь лучше, чем пользователи жалуются на исходе хранения;)

Основываясь на вашем примере выше, я бы рекомендовал также с помощью метода executeTransaction (вместо начала/совершения сделки), предоставленные области:

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

drealm.close(); 
+0

На самом деле, положите его окончательно – EpicPandaForce

+0

Я слышал противоречивую информацию о 'realm.close()' - некоторые говорили, что используют этот метод каждый раз, когда вы открываете новый экземпляр, тогда как другие сказали, что у него есть только один «realm.close» () 'в' onDestroy() 'достаточно. У меня есть один божественный актив, много диалогов, адаптеры и т. Д., Все открывающие новые экземпляры. 'realm.close()' должен быть добавлен к этим фрагментам, адаптерам и так далее? Спасибо – zngb

+0

@zngb Я до сих пор новичок в области, и мои связи в реальном мире открываются только до тех пор, пока они мне нужны. У меня была одна проблемная область, где мое приложение разбивалось во время разработки, и когда я включил 'realm.close()' там, мои проблемы с размером файла исчезли. В документации звучит так, как будто размер файла растет с каждой открытой транзакцией, поэтому я интерпретировал это как означающее, что я должен как можно быстрее закрыть соединения, чтобы избежать больших файлов. – oddmeter

Смежные вопросы