Android 复制数据库的更新

Android 复制数据库的更新,android,sqlite,Android,Sqlite,在我的应用程序中,数据库是只读的。因为我正在使用预先存在的sqlite数据库在设备上创建数据库。我在下一次更新中的问题是,我想更改或更新数据库的内容,如何实现这一点。我从这个类复制数据库,就代码而言,我认为当我在play store上发布更新时,更新的数据库不会被复制,因为它已经存在了 public class Setupdb extends SQLiteOpenHelper { private static String DB_PATH = ""; private static

在我的应用程序中,数据库是只读的。因为我正在使用预先存在的sqlite数据库在设备上创建数据库。我在下一次更新中的问题是,我想更改或更新数据库的内容,如何实现这一点。我从这个类复制数据库,就代码而言,我认为当我在play store上发布更新时,更新的数据库不会被复制,因为它已经存在了

public class Setupdb extends SQLiteOpenHelper {

  private static String DB_PATH = "";
    private static final String DB_NAME = "camprep.sqlite";
    private SQLiteDatabase myDataBase;
    private final Context myContext;

    private static Setupdb mDBConnection;


public Setupdb(Context context) {
    super(context, DB_NAME, null, 3);
    this.myContext=context;
    DB_PATH="/data/data/"
            + context.getApplicationContext().getPackageName()
            + "/databases/";
    Log.e(DB_NAME, DB_PATH);
}
public static synchronized Setupdb getDBAdapterInstance(Context context) {
    if (mDBConnection == null) {
        mDBConnection = new Setupdb(context);
    }
    return mDBConnection;
} 

    public void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();
        if (dbExist) {
            Log.e("db","exist");
            // do nothing - database already exist
        } else {
            // By calling following method
            // 1) an empty database will be created into the default system path of your application
            // 2) than we overwrite that database with our database.
            this.getReadableDatabase();
            try {
                Log.e("calling", "copy");
                copyDataBase(); 
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }





}
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);

        } catch (SQLiteException e) {
            // database does't exist yet.
        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false; 
    }

    private void copyDataBase() throws IOException {
        // Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);
        // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME; 
        // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);
        // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }
        // Close the streams
    myOutput.flush(); 
    myOutput.close();
    myInput.close();
} 


    public void openDataBase() throws SQLException {
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    }
    public synchronized void close() {
        if (myDataBase != null)
            myDataBase.close();
        super.close(); 
    } 

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


}

}/P>您可以考虑切换到使用<代码> SqtLaseSeSelp,它有一个按照您描述的方式更新数据库的框架:您不必检查数据库是否存在,增加数据库版本并在OnUpgrade中添加东西,如果OnEngy被称为仅复制。it@nandeesh先生可以看出,我没有在db creative中使用oncreate和onupgrade,因为当db版本高于当前版本时,onupgrade只调用一次,所以在onupgrade mycontext.deleteDatabase(db_NAME)中可以实现这一点