Как обновить базу данных, не удаляя данные, введенные пользователем в предыдущей базе данных?

Я создаю приложение, которое нуждается в базе данных. Я создал его с помощью браузера базы данных sqlite, что означает приложение, которое я создал, импортирует базу данных, которую я создал в телефоне.

Приложение, которое я создаю, требует, чтобы пользователь вводил данные в базу данных. При обновлении базы данных я надеюсь сохранить данные, которые пользователь вводил.

Ниже приведен код моей базы данных:

public class DatabaseHelper extends SQLiteOpenHelper { //The Android's default system path of your application database. private static String DB_PATH = "/data/data/test.test/databases/"; private static String DB_NAME = "TestDatabase"; private static final int DB_VERSION = 1; private SQLiteDatabase myDatabase; private final Context myContext; /** * # Constructor # * Takes and keeps a reference of the passed context in order to access to the application assets and resources. * @param context */ public DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); this.myContext = context; }//constructor /** * # Create Database # * Creates a empty database on the system and rewrites it with your own database. */ public void createDatabase() throws IOException { boolean dbExist = checkDatabase(); if(dbExist) { //do nothing - database already exist }//if else { //By calling this method and empty database will be created into the default system path //of your application so we are gonna be able to overwrite that database with our database. this.getReadableDatabase(); try { copyDatabase(); } catch (IOException e) { throw new Error("Error copying database"); }//catch }//else }//createDatabase 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. }//catch if(checkDB != null) { checkDB.close(); }//if return checkDB != null ? true : false; }//checkDatabase 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(); }//copyDatabase // # open database # public void openDatabase() throws SQLException { //Open the database String myPath = DB_PATH + DB_NAME; myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); }//openDatabase @Override public synchronized void close() { if(myDatabase != null) myDatabase.close(); super.close(); }//close @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public List<String> selectData (String tableName, String [] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { List<String> list = new ArrayList<String>(); Cursor cursor = this.myDatabase.query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy); if (cursor.moveToFirst()) { do { list.add(cursor.getString(0)); } while (cursor.moveToNext()); } if (cursor != null && !cursor.isClosed()) { cursor.close(); } return list; }//selectData public void insertData (String tableName, String nullColumnHack, ContentValues values) { try { myDatabase.insert(tableName, nullColumnHack, values); } catch (Exception e) { Log.e("Error :","unable to insert data"); }//catch }//insertData //edit row public void updateData (String tableName, ContentValues values, String whereClause, String[] whereArgs) { try { myDatabase.update(tableName, values, whereClause, whereArgs); } catch (Exception e) { Log.e("Error :","unable to update data"); }//catch }//updateData public void deleteRow (String tableName, String whereClause, String[] whereArgs) { try { myDatabase.delete(tableName, whereClause, whereArgs); } catch (Exception e) { Log.e("Error :","unable to delete row"); }//catch }//deleteRow } 

* Note: Моя база данных состоит из нескольких таблиц. Две таблицы требуют ввода пользователя. Другие – нет.

Я надеюсь, что можно дать реальный ответ, вместо того, чтобы давать веб-сайт, который не находится в точной ситуации, что у меня есть, так как я легко запутался.

Вы должны добавить код в метод onUpgrade . При этом вы можете проверить oldVersion и newVersion и выполнить соответствующие инструкции ALTER TABLE. Как вы можете видеть, текущая версия – 23, а контрольный код проверяет, что такое старая версия. Если версия 22 выполняет только инструкции v22, но если версия 21, она выполняет как инструкции v21, так и v22. Это часть приложения ввода-вывода Google:

 private static final int VER_LAUNCH = 21; private static final int VER_SESSION_FEEDBACK_URL = 22; private static final int VER_SESSION_NOTES_URL_SLUG = 23; private static final int DATABASE_VERSION = VER_SESSION_NOTES_URL_SLUG; ... @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.d(TAG, "onUpgrade() from " + oldVersion + " to " + newVersion); // NOTE: This switch statement is designed to handle cascading database // updates, starting at the current version and falling through to all // future upgrade cases. Only use "break;" when you want to drop and // recreate the entire database. int version = oldVersion; switch (version) { case VER_LAUNCH: // Version 22 added column for session feedback URL. db.execSQL("ALTER TABLE " + Tables.SESSIONS + " ADD COLUMN " + SessionsColumns.SESSION_FEEDBACK_URL + " TEXT"); version = VER_SESSION_FEEDBACK_URL; case VER_SESSION_FEEDBACK_URL: // Version 23 added columns for session official notes URL and slug. db.execSQL("ALTER TABLE " + Tables.SESSIONS + " ADD COLUMN " + SessionsColumns.SESSION_NOTES_URL + " TEXT"); db.execSQL("ALTER TABLE " + Tables.SESSIONS + " ADD COLUMN " + SessionsColumns.SESSION_SLUG + " TEXT"); version = VER_SESSION_NOTES_URL_SLUG; } Log.d(TAG, "after upgrade logic, at version " + version); if (version != DATABASE_VERSION) { Log.w(TAG, "Destroying old data during upgrade"); db.execSQL("DROP TABLE IF EXISTS " + Tables.BLOCKS); // ... delete all your tables ... onCreate(db); } }