如何在sqlite android中进行更改



我有一个现有的数据库,它工作得很好,我需要在其中添加一些更改。在这些更改之后,数据库不工作。我应该如何更改数据库,以保持现有的和添加新的更改?任何帮助都是感激的。这是原始的db

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
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 database = this.getWritableDatabase();
String selection = "_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});
if (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)});

if(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 database = this.getWritableDatabase();
String selection = "_id = ?";
ContentValues contentValues = new ContentValues();
contentValues.put(_ID,_id);
contentValues.put(LAST_NO,last_no);
long result = database.update(TABLE_NAME , contentValues , _ID + " =? " ,
new String[]{_id});
if (result == -1){
return false;
} else {
return true;
}

}

您需要ALTER表来添加新的LAST_NO列,因为您希望保留现有的数据。也就是说你想升级数据库这就是onUpgrade方法用于。

如果版本号增加,则调用onUpgrade方法。所以(1)首先要做的是将版本号从1更改为2。

。changesuper(context, DATABASE_NAME, null, 1);tosuper(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, " //<<<< ADDED FOR version 2
+ _ID + " TEXT NOT NULL)";
db.execSQL(create_table);
}
  • 你可能需要也可能不需要DEFAULT子句

(3)然后,您需要更改onUpgradeNOT删除表(您将丢失所有数据)并将其删除到NOT调用onCreate方法(如果表没有被删除,这将失败(如果你有CREATE TABLE IF NOT EXISTS .....,那么它不会失败))

onUpgrade方法应该检查是否从版本1升级到版本2,只有在版本1升级到版本2时才修改表。你需要检查传递给功能的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);
/* Add upgrade for version 2 */
if (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);
/* Add upgrade for version 2 */
if (oldVersion < 2) {
db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN " + LAST_NO + " INTEGER DEFAULT 0");
}
if (oldversion <3) {
....
}
/* an so on */
}

您似乎要向表中添加一个新列,因此您需要进行升级过程。

要触发升级,你需要增加构造函数

中给出的版本当前版本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应该始终是新的模式)

最新更新