2017-12-18 59 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(); 
     } 
    } 
} 

을 그리고 난 다시 확인. 파일은 여전히 ​​7MB이지만 비어 있습니다. 안에 영역 객체가 없습니다. 동일한 데이터를 다시 얻으면 14MB로 늘어나므로 데이터를 삭제하면 14MB가 비어서 21로 증가합니다 ... 등등. 어느 것이 거대한 파일이 될 수 있습니다. 그리고 나는 이런 일이 일어나지 않을 것이라고 확신합니다. 왜 렐름이 이것을합니까? 이 내가 이야기하고있는 파일입니다 : Realm FAQ에서 https://www.dropbox.com/s/ri95yiwjutjiki6/myrealm.realm?dl=0

+0

일반적으로 이는 백그라운드 스레드의 닫히지 않은 영역 인스턴스로 인해 발생합니다. 백그라운드 스레드에서 열려있는 영역 인스턴스가 있습니까? 스레드가 종료되면 닫히지 않습니까? https://realm.io/docs/java/latest/#faq-large-realm-file-size – beeender

답변

1

, 이것은 예상 할 수 있으며, 데이터베이스가 결국 공간을 다시 사용합니다.

즉, Realm#compactRealm(RealmConfiguration)을 호출하여 데이터베이스 압축을 강제 할 수 있습니다. documentation을 참조하십시오.

+0

에서 확인하십시오. 하지만 여전히, 나는 1 년 넘게이 앱을 사용하는 사용자를 알아 냈고 우리 앱이 6GB의 데이터를 사용하고 있음을 알았습니다. 그게 많이 있습니다. –

+0

모든 항목을 삭제 한 후 'Realm # compactRealm (RealmConfiguration)'을 추가하도록 제안 할 수 있습니다. 나는이 특정 사용자에 대해 모른다. 그러나 이것은 버그처럼 보일 것이다. 대체 (또는 추가) 옵션은 기기가 충전기에 연결되어있을 때 (보통 밤 시간대) 데이터베이스를 압축하거나, JobScheduler (또는 5.0 이전 버전과의 호환이 필요한 경우 Firebase JobDispatcher)를 사용하여 데이터베이스의 압축을 예약하는 것입니다. github.com/firebase/firebase-jobdispatcher-android). –

+0

저는 이제 Realm을 사용하고 있습니다. 코드를 수정해야했습니다. 왜냐하면 저는 다른 스레드에서 열려 있고 제대로 닫히지 않은 영역의 인스턴스가 있었기 때문입니다.하지만 이제는 작동합니다. Upvoted 및 답변을 수락 –