Android SQLite数据库升级

本文介绍了Android应用中使用SQLite数据库进行版本升级的三种不同策略:直接删除重建、保留旧表数据并迁移以及多版本逐步升级。每种方法都有详细的步骤说明及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值