2015-10-04 127 views
0

我正在使用我的現有數據庫和我的android聯繫人應用程序。它第一次正常工作。如果我升級資產文件夾的數據庫並重新安裝應用程序,則數據庫不會升級它,以便在模擬器上運行應用程序時顯示舊的應用程序。使用Android應用程序使用現有數據庫時升級數據庫

如何,如果我在使用現有的數據庫的情況下改變應用程序的每一個版本的DB版本onUpgrade()方法的工作?

這裏是當你增加你的數據庫的版本號我DataBaseHelper.java

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DataBaseHelper extends SQLiteOpenHelper 
{ 
    private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window 
    //destination path (location) of our database on device 
    private static String DB_PATH = ""; 
    private static String DB_NAME ="SBLdata.db";// Database name 
    private static String DATABASE_TABLE ="SBL_Contact";// Database name 
    private static final int DATABASE_VERSION = 1; 
    private SQLiteDatabase mDataBase; 
    private final Context mContext; 
    private SQLiteDatabase db; 
    private int oldVersion; 
    private int newVersion; 

    public DataBaseHelper(Context context, String dbName) 
    { 
     super(context, DB_NAME, null, DATABASE_VERSION); 
     if(android.os.Build.VERSION.SDK_INT >= 17){ 
      DB_PATH = context.getApplicationInfo().dataDir + "/databases/"; 
     } 
     else 
     { 
      DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
     } 
     this.mContext = context; 
    } 

    public void createDataBase() throws IOException 
    { 
     //If database not exists copy it from the assets 

     boolean mDataBaseExist = checkDataBase(); 
     if(!mDataBaseExist) 
     { 
      this.getReadableDatabase(); 
      this.close(); 
      try 
      { 
       //Copy the database from assests 
       copyDataBase(); 
      } 
      catch (IOException mIOException) 
      { 
       throw new Error("ErrorCopyingDataBase"); 
      } 
     } 
    } 
    //Check that the database exists here: /data/data/your package/databases/Da Name 
    private boolean checkDataBase() 
    { 
     File dbFile = new File(DB_PATH + DB_NAME); 
     return dbFile.exists(); 
    } 

    //Copy the database from assets 
    private void copyDataBase() throws IOException 
    { 
     InputStream mInput = mContext.getAssets().open(DB_NAME); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream mOutput = new FileOutputStream(outFileName); 
     byte[] mBuffer = new byte[1024]; 
     int mLength; 
     while ((mLength = mInput.read(mBuffer))>0) 
     { 
      mOutput.write(mBuffer, 0, mLength); 
     } 
     mOutput.flush(); 
     mOutput.close(); 
     mInput.close(); 
    } 

    //Open the database, so we can query it 
    public boolean openDataBase() throws SQLException 
    { 
     String mPath = DB_PATH + DB_NAME; 
     mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
     return mDataBase != null; 
    } 

    @Override 
    public synchronized void close() 
    { 
     if(mDataBase != null) 
      mDataBase.close(); 
     super.close(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) {} 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion < DataBaseHelper.DATABASE_VERSION) { 
      //drop old table and create and copy the new one 
     }else{ 
      //do Nothing 
     } 
    } 

} 
+0

你使用的是sqliteasset helper嗎? –

回答

0

OnUpgrade被調用。

+0

請發表適當的答案 – Firefog

+0

你問「如果我改變每個版本的應用程序的數據庫版本,以便使用現有的數據庫時,onUpgrade()方法如何工作?」我讀到這個時候onUgrade被調用? –

+0

如果您想在每次發佈新應用程序版本時將新數據加載到數據庫中,則需要增加版本號並將數據插入到OnUpgrade語句中。或者,只需創建並使用具有新名稱的新數據庫即可。 –

0

你在onUpgrade()中做了什麼取決於你。您可以創建新的數據庫或以任何您想要的方式升級現有的數據庫。這意味着您必須手動刪除舊錶並將這些數據插入到新表中。或使用ALTER_TABLE。

+0

你能告訴我一個例子? – Firefog

+0

幾乎所有的教程有DROP表在'onUpgrade()'你可以谷歌的ALTER_TABLE,但數據庫版本必須更新,以得到它叫 – haseeb

+0

你知道我使用我現有的數據庫而不是創建。所以'onUpgrade()'方法正在工作。 – Firefog

相關問題