我有一個作業正常的現有資料庫,我需要在其中添加一些變化。在這些更改之后,資料庫就不作業了。我應該如何改變資料庫,以保持現有的和添加新的變化?希望得到任何幫助。這里是原始的資料庫
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "DATABASE_NAME.db" 。
public static final String TABLE_NAME = "POSITION_TABLE" 。
private static final String _ID = "_id" 。
private static final String RADIO_BUTTON_POSITION = "radio_button_position" 。
public DBHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, 1) 。
}
@Override[/span
public void onCreate(SQLiteDatabase db) {
String create_table = "CREATE TABLE " TABLE_NAME " ( " )
"ID INTEGER PRIMARY KEY ,"
RADIO_BUTTON_POSITION " TEXT NOT NULL, "
_ID " TEXT NOT NULL)"。)
db.execSQL(create_table)。
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop Table if exists" TABLE_NAME)。
onCreate(db)。
}
}
public boolean updateButtonPosition(String _id,String radio_button_position){
SQLiteDatabase資料庫 = this.getWritableDatabase();
字串選擇 = "_id = ?" 。
ContentValues contentValues = new ContentValues()。
contentValues.put(_ID,_id);
contentValues.put(RADIO_BUTTON_POSITION,radio_button_position)。
long result = database.update(TABLE_NAME , contentValues , _ID " =? " ,
new String[]{_id})。)
如果(result == -1){
return false。
} else {
return true;
}
}
public int readButtonPosition(String _id,String radio_button_position)
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT" RADIO_BUTTON_POSITION " FROM "
TABLE_NAME " WHERE " _ID " =? " , new String[] {String.valueOf(_id)})。)
如果(cursor.moveToFirst()){
return cursor.getInt(cursor.getColumnIndex(RADIO_BUTTON_POSITION)) 。
} else {
return 0;
}
}
這是我想在上述資料庫中增加的新內容。
private static final String LAST_NO = "LAST_NO" 。
public boolean updateNumber(String _id,int last_no){
SQLiteDatabase資料庫 = this.getWritableDatabase()。
字串選擇 = "_id = ?" 。
ContentValues contentValues = new ContentValues()。
contentValues.put(_ID,_id);
contentValues.put(LAST_NO,last_no)。
長result = database.update(TABLE_NAME , contentValues , _ID " =? " ,
new String[]{_id})。)
如果(result == -1){
return false。
} else {
return true;
}
uj5u.com熱心網友回復:
你似乎要在表中添加一個新的列,所以你需要經歷升級程序。
為了觸發升級,你需要增加建構式中給定的版本
你目前的版本1是呼叫建構式的超類的最后一個引數
public DBHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, 1) 。
因此,由于這可能是你的第二個版本的資料庫,所以這個值應該是2
例如:
public DBHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, 2) 。
或者更籠統地說
super(context, DATABASE_NAME, null, DATABASE_VERSION) 。
然后onUpgrade方法將被呼叫,因為存盤在資料庫中的版本號與你當前打開它的版本號不匹配。
你的onUpgrade洗掉了退出的表并重新創建了它,但是由于你當前的onCreate沒有添加新的列LAST_NO,這也需要被更新為類似的內容
@Override
public void onCreate(SQLiteDatabase db) {
String create_table = "CREATE TABLE " TABLE_NAME " ( " )
"ID INTEGER PRIMARY KEY ,"
RADIO_BUTTON_POSITION " TEXT NOT NULL, "
"LAST_NO" " INTEGER, "
_ID " TEXT NOT NULL)"。)
db.execSQL(create_table)。
如果你想保留資料庫中的現有資料,而不是在onUpgrade中放棄資料庫并重新創建它,你應該在那里使用ALTER TABLE命令來代替(但是onCreate應該始終是新的模式)
uj5u.com熱心網友回復:
你需要ALTER表來添加新的LAST_NO列,因為你想保留現有資料。也就是說,你想升級資料庫,這就是onUpgrade方法的用途。
如果版本號增加,onUpgrade方法將被呼叫。所以(1)要做的第一件事就是把版本號從1改成2。
即把版本號從1改為2。
即把super(context, DATABASE_NAME, null, 1);改為super(context, DATABASE_NAME, null, 2);
由于任何新的安裝(相對于升級)將是在版本2,那么onCreate方法應該反映升級,所以(2)將其改為:-
@Override
public void onCreate(SQLiteDatabase db) {
String create_table = "CREATE TABLE " TABLE_NAME " ( " )
"ID INTEGER PRIMARY KEY ,"
RADIO_BUTTON_POSITION " TEXT NOT NULL, "
LAST_NO " INTEGER DEFAULT 0, " //< <<<增加了for版本2。
_ID " TEXT NOT NULL)"。)
db.execSQL(create_table)。
- 你可能需要也可能不需要DEFAULT子句 。
(3)然后你需要改變onUpgrade方法為ALTER表,并且NOT洗掉表(你將失去所有的資料)和NOT呼叫onCreate方法(如果表未被洗掉,這將失敗(如果你有CREATE TABLE IF NOT EXISTS . ....,那么它就不會失敗))。
onUpgrade方法應該檢查是否從版本1升級到2,如果是的話,它應該ALTER該表。所以你需要檢查傳遞給該方法的newVersion是否為2,如果是,那么你就使用execSQL方法發出ALTER命令來增加列。例如,onUpgrade方法可以是:-
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/* commmented out for version 2*/
// db.execSQL("drop Table if exists " TABLE_NAME)。
// onCreate(db)。
/* 為版本2添加升級 */
如果(oldVersion == 1 & & newVersion == 2) {
db.execSQL("ALTER TABLE " TABLE_NAME " ADD COLUMN " LAST_NO " INTEGER DEFAULT 0 ") 。
}
然后表將被改變以包括新的列。
額外的 - 逐步升級 :-
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/* commmented out for version 2*/
// db.execSQL("drop Table if exists " TABLE_NAME)。
// onCreate(db)。
/* 為版本2添加升級 */
如果(oldVersion < 2) {
db.execSQL("ALTER TABLE " TABLE_NAME " ADD COLUMN " LAST_NO " INTEGER DEFAULT 0 ") 。
}
如果(oldversion <3) {
....
}
/* an so on */
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/327119.html
標籤:
上一篇:為什么這個查詢在AndroidStudio中AppInspection的DatabaseInspector部分可以作業,而在RoomQuery中卻不行?
下一篇:SpringDATAJPA傳遞兩個引數-無法提取結果集;SQL[n/a];org.hibernate.exception.SQLGrammerException:無法提取結果集
