2017-12-18 16 views
2

私は自分のアプリケーション内で使用する領域データベースを持っています。 ファイルのサイズは7MBです。内部にはさまざまなオブジェクトがあります。 しかし、私は、この関数を呼び出す:レルムDBオブジェクトを削除しますが、すべてのオブジェクトが空であっても、レルムファイルのサイズは変わりません。時間が経つにつれて大きくなりすぎる

public static void deleteRealm(Context context) { 
    Realm realm = PSApplicationClass.getInstance().getRealm(); 
    try { 
     Log.i("", "realm start"); 
     realm.executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       realm.delete(Destination.class); 
       realm.delete(TripStep.class); 
       realm.delete(TripStop.class); 
       realm.delete(Route.class); 
       realm.delete(RealmLocation.class); 
       realm.delete(CoordLocation.class); 
       realm.delete(PSTrip.class); 
       realm.delete(PSUser.class); 
       realm.delete(UserVehicle.class); 
       realm.delete(Vehicle.class); 
       realm.delete(MileageRates.class); 
       realm.delete(PSUserActivityMonth.class); 
       realm.delete(PSUserActivityWeek.class); 
       realm.delete(PSUserActivityYear.class); 
       realm.delete(Activity.class); 
       realm.delete(PSTripsStats.class); 
       realm.delete(Report.class); 
       realm.delete(Setting.class); 
       realm.delete(AddressComponent.class); 
       realm.delete(RealmString.class); 
       realm.delete(RealmInt.class); 
       realm.deleteAll(); 
      } 
     }); 
     Log.i("", "realm end"); 
    } catch (Exception e) { 
     Log.i("", "realm continue initTrip error trying to add to realm:" + e.getMessage()); 
     if (realm.isInTransaction()) { 
      realm.cancelTransaction(); 
     } 
    } 
} 

そして私はもう一度確認してください。ファイルはまだ7 MBですが、空です。内部にはレルムオブジェクトはありません。 同じデータをもう一度取得すると、14MBになります。そのデータを削除すると、14MBの空き容量があり、21に増加します。それはそれが巨大なファイルになる原因になります。そして、私はこれが起こるべきではないと確信しています。なぜレルムはこれをしますか? これは私が話しているファイルです:Realm FAQから https://www.dropbox.com/s/ri95yiwjutjiki6/myrealm.realm?dl=0

+0

通常は、バックグラウンドスレッド上で非閉じのRealmインスタンスによって引き起こされます。バックグラウンドスレッドで開いたRealmインスタンスがありますか?スレッドが終了したときに閉じられていませんか? https://realm.io/docs/java/latest/#faq-large-realm-file-size – beeender

答えて

1

、これが予想され、データベースは最終的にスペースを再利用します。

つまり、Realm#compactRealm(RealmConfiguration)を呼び出すことで、データベースの圧縮を強制することができます。 documentationを参照してください。

+0

Okを見てください。それでも、私はこのアプリを1年以上利用しているユーザーがいて、私たちのアプリが6GBのデータを使っていることに気づきました。それはたくさんあります。 –

+0

すべてのエントリを削除した後、 'Realm#compactRealm(RealmConfiguration)'を追加することをお勧めします。私はこの特定のユーザーについてはわかりませんが、これはバグのように見えます。代替オプション(または追加オプション)は、デバイスがチャージャに接続されているとき(通常は夜間)データベースの圧縮をスケジュールすること、 'JobScheduler'(または5.0より前の互換性が必要な場合はFirebase JobDispatcher)を使用してhttps:// github.com/firebase/firebase-jobdispatcher-android)。 –

+0

コンパクトレルムを使用していますが、コードを修正しなければなりませんでした。なぜなら、私たちは別のスレッドから開いていて、正しく閉じられていないレルムのインスタンスを持っていたからです。あなたの答えをアップアップして受け入れました –

関連する問題