SQLite数据库大小越来越大

时间:2014-07-14 08:37:31

标签: android sqlite

我正在试图"吸尘" SqLite数据库的命令

     String sql = "VACUUM;" ;
    if(!IsSyncTriggered()){
        databaseInstance.execSQL(sql);
        databaseInstance.setTransactionSuccessful();
    }

我的完整课程

        public class AppServiceDBClean extends WakefulIntentService {   
int FIVE_MINUTES = 5*60*1000;
public AppServiceDBClean() {
    super("AppService");     
}       

@Override
protected void doWakefulWork(Intent intent) {
    // Toast.makeText(getApplicationContext(), "App services", 50000).show();

    try {
        doCleanUPDB();
    }
    catch (Exception e) {
        Log.e("AppService", "Exception appending to log file", e);
    }  
}
public boolean IsSyncTriggered() {

    boolean isActive = false;
    AccountManager am = AccountManager.get(getBaseContext());
    Account[] ac = am.getAccountsByType(Constants.ACCOUNT_TYPE);
    if (ac.length > 0) {
        isActive = ContentResolver.isSyncActive(ac[0], Constants.AUTHORITY);
    }
    return isActive;
}
public void doCleanUPDB(){

    /**
     * Create some basic instance of database interaction
     */
    DaoSession daoSessionUni = TAndroidApplicationContext.getInstance().getDaoSession();
    TAndroidApplicationContext tAndroidApplicationContext = TAndroidApplicationContext.getInstance();
    TDatabaseLibrary tDB = TDatabaseLibrary.getInstance(tAndroidApplicationContext.getApplicationContext());
    SQLiteDatabaseWrapper databaseInstance = tDB.getDatabase();
    String sql = "VACUUM;" ;
    if(!IsSyncTriggered()){
        databaseInstance.execSQL(sql);
        databaseInstance.setTransactionSuccessful();
        //databaseInstance.endTransaction();
    }else{
        /**
         * If the sync is in progress
         * wait for 10 minutes and try again
         * */
        try {
            Thread.sleep(FIVE_MINUTES);
        } catch (InterruptedException e) {
            Log.d("DataCleaningService","SleepException ",e);
            e.printStackTrace();     

        }
    }




}

}

IsSyncTriggered()是用户定义方法。我试图通过一个每24小时运行一次的服务来实现这一目标。但我的数据库大小并没有减少。即使某些行表格被删除,它仍然会增加。我错过了什么请帮助我。在此先感谢所有人。

1 个答案:

答案 0 :(得分:1)

您可以启用auto_vacuum并升级bbdd。如果您将数据与Web服务或类似内容同步,则不应该有任何问题。 如果你不能丢失数据,那么试试这个:

删除最后一个“;”从命令。我知道这可能听起来很愚蠢,但我在sqlite上恢复的所有关于真空的信息都没有它,所以也许甚至没有触发命令。

if(!IsSyncTriggered()){
    databaseInstance.execSQL("VACUUM");
    databaseInstance.setTransactionSuccessful();
    //databaseInstance.endTransaction();
}else{

还有一个针对以前的Android版本2.3上的vacuum命令的错误报告。如果您在该版本或之前的版本上遇到此问题,则应该更多地搜索该错误。

Bug report

希望它有所帮助。