2015-10-04 97 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

相关问题