2014-02-05 88 views
0

我有兩個數據庫,一個數據庫是主要的。這個主數據庫負責保存最新的當前數據,並且通過cron作業填充我的輔助數據庫,一旦主數據庫過時,我想用輔助數據庫替換它,只需通過寫一個文件操作現有的數據庫和刷新我的看法。有沒有可能做到這一點,有沒有更好的辦法?在運行時用另一個數據庫替換數據庫。

到目前爲止,我所做的是:

public void writeToSD() throws IOException { 
     File f=new File("/mnt/sdcard/dump.db"); 
     FileInputStream fis=null; 
     FileOutputStream fos=null; 

     try{ 
      fis=new FileInputStream(f); 


      fos=new FileOutputStream("/data/data/com.one.two/databases/Bdr"); 
      while(true){ 
       int i=fis.read(); 
       if(i!=-1){ 
        fos.write(i); 
       } 
       else{ 
        break; 
       } 
      } 
      fos.flush(); 

     } 
     catch(Exception e){ 
      e.printStackTrace(); 

     } 
     finally{ 
      try{ 
       fos.close(); 
       fis.close(); 
      } 
      catch(IOException ioe){ 
       System.out.println(ioe); 
      } 
     } 
+0

爲什麼主數據庫獲取過時如果它是最新的?什麼是更改爲第二個數據庫的原因? – sqlab

+0

主數據庫每五分鐘過時一次。數據值改變! – User3

+0

爲什麼你不更新主數據庫? – sqlab

回答

1

如何始終使用相同的數據庫文件(假設DBA,DBB)與SQLiteOpenHelper的兩個實例,並使用實用工具類,像這樣的,而不是使用原始SQLiteOpenHelper:

class Db { 
    private SQLiteOpenHelper mPrimaryDb; 
    private SQLiteOpenHelper mSecondaryDb; 

    public Db(Context context) { 
    mPrimaryDb = new MyDbHelper(context, "db_a"); 
    mSecondaryDb = new MyDbHelper(context, "db_b"); 
    } 

    public SQLiteOpenHelper getPrimaryDb() { 
    return mPrimaryDb; 
    } 

    public SQLiteOpenHelper getSecondaryDb() { 
    return mSecondaryDb; 
    } 

    public void swapDb() { 
    SQLiteOpenHelper tmp = mPrimaryDb; 
    mPrimaryDb = mSecondaryDb; 
    mSecondaryDb = tmp; 
    // TODO: notify data users that data has changed, cleanup the old primary database, etc. 
    } 
{ 
+0

這個想法看起來不錯,但是我現在使用了交易。他們加快了我的批量插入。我一定會試試這個! – User3

1

如果你想使用的文件操作,重命名數據庫文件的速度更快。但在文件操作過程中,所有連接必須在任何操作之前關閉。

如果插入太慢,我不會覆蓋數據庫文件。我將生成一個臨時名稱和相同的表和視圖結構的新數據庫。完成寫入臨時文件後,我會將該文件重命名爲與舊數據庫的不變部分以及版本號或時間戳相同的名稱。而在我的應用程序中,我會定期查看新版本,如果發現,我會關閉與舊文件的所有連接並打開新數據庫。

相關問題