Android操作SQLite数据库要实现SQLiteOpenHelper类。
SQLiteOpenHelper的实现类要重写两个方法onCreate和onUpgrade。
onUpgrade方法就是用于SQLite数据库升级
问题一.数据库升级时直接将老表删除
SQLiteOpenHelper 实现类代码
package com.wjn.androiddbdemo.utils.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* SQLiteOpenHelper实现类
* */
public class SQLiteHelp extends SQLiteOpenHelper {
/**
* 构造方法
* */
public SQLiteHelp(Context context, String name, SQLiteDatabase.CursorFactory factory,int version) {
super(context, name, factory, version);
}
/**
* onCreate方法,第一次创建时调用---->建表
* */
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id int,name varchar(20))";
db.execSQL(sql);
}
/**
* onUpgrade方法,更新数据库版本时调用---->删除原来的表,重新执行onCreate方法
* */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "DROP TABLE IF EXISTS user";
db.execSQL(sql);
onCreate(db);
Log.d("TAG","数据库升级!!!");
}
}
即 onUpgrade方法中
1.先删除表
String sql = "DROP TABLE IF EXISTS user";
db.execSQL(sql);
2.再执行onCreate方法重新建表
onCreate(db);
问题二.数据库升级时要保留老表
解决方法
1.将旧表改名成临时表: ALTER TABLE User RENAME TO _temp_User;
2.创建新表: CREATE TABLE User (u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));
3.导入数据:INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User; //原表中没有的要自己设个默认值
4.删除临时表:DROP TABLE_temp_User;
SQLiteOpenHelper 实现类代码
package com.wjn.androiddbdemo.utils.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* SQLiteOpenHelper实现类
* */
public class SQLiteHelp extends SQLiteOpenHelper {
/**
* 构造方法
* */
public SQLiteHelp(Context context, String name, SQLiteDatabase.CursorFactory factory,int version) {
super(context, name, factory, version);
}
/**
* onCreate方法,第一次创建时调用---->建表
* */
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id int,name varchar(20))";
db.execSQL(sql);
}
/**
* onUpgrade方法,更新数据库版本时调用---->删除原来的表,重新执行onCreate方法
* */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//1.将旧表改名成临时表
String sql1 = "ALTER TABLE user RENAME TO _temp_User";
//2.创建新表
String sql2=" CREATE TABLE user (id int,name varchar(20),describe varchar(200));";
//3.将临时表的数据导入到新表 原表中没有的要自己设个默认值
String sql3="INSERT INTO User SELECT id,name,\"这是描述\" FROM _temp_User";
//4.删除临时表
String sql4="DROP TABLE _temp_User";
db.execSQL(sql1);
db.execSQL(sql2);
db.execSQL(sql3);
db.execSQL(sql4);
}
}
Activity代码
package com.wjn.androiddbdemo.activity.sqlite;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import com.wjn.androiddbdemo.R;
import com.wjn.androiddbdemo.utils.db.SQLiteHelp;
import com.wjn.androiddbdemo.utils.ui.StatusBarUtil;
public class SQLiteUpdateActivity extends AppCompatActivity implements View.OnClickListener {
private TextView textView1;
private TextView textView;
private SQLiteHelp dbHelp;//帮助类对象
private SQLiteDatabase db;//用于管理和操作SQLite数据库
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqliteupdate);
initView();
}
/**
* 初始化各种View
*/
private void initView() {
//根据状态栏颜色来决定 状态栏背景 用黑色还是白色 true:是否修改状态栏字体颜色
StatusBarUtil.setStatusBarMode(this, false, false, R.color.colorPrimary);
textView1 = findViewById(R.id.activity_sqliteupdate_textview1);
textView = findViewById(R.id.activity_sqliteupdate_textview);
textView1.setOnClickListener(this);
//提高版本升级数据库
dbHelp = new SQLiteHelp(this, "Test.db", null, 2);
}
/**
* 各种点击事件的方法
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.activity_sqliteupdate_textview1://查询升级后的数据库
findbtnMethod();
break;
default:
break;
}
}
/**
* 查询升级后的数据库
*/
public void findbtnMethod() {
db = dbHelp.getReadableDatabase();//打开数据库对象
Cursor cursor = db.query("user", null, null, null, null, null, null);
//遍历游标对象
cursor.moveToFirst();
StringBuilder sb = new StringBuilder();
while (!cursor.isAfterLast()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
sb.append("ID:" + id + "\n");
String name = cursor.getString(cursor.getColumnIndex("name"));
sb.append("姓名:" + name + "\n");
String describe = cursor.getString(cursor.getColumnIndex("describe"));
sb.append("描述:" + describe + "\n\n");
cursor.moveToNext();
}
textView.setText(sb.toString());
cursor.close();
db.close();
}
}
结果
升级前
升级后
问题三.数据库升级时要保留老表(V1 V2 V3 版本)
假如我们已经升级到第三个版本了,我们在第二个版本增加了一个表, 然后第三个版本也增加了一个表,假如用户直接从第一个版本升级到第三个版本,这样 没经过第二个版本,就没有增加的那个表。解决方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion){
case 1:
db.execSQL(第一个版本的建表语句);
case 2:
db.execSQL(第二个版本的建表语句);
case 3:
db.execSQL(第三个版本的建表语句);
}
}
代码链接:https://github.com/wujianning/AndroidDBDemo