升级SQLite数据库最佳写法

SQLite简介

SQLite是android中内置的一款轻量级的关系型数据库。支持标准的SQL语法,还遵循数据库的ACID事务。

如何创建数据库

Android为了让我们能够更加方便的管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单的对数据库进行创建和升级。我们可以自己创建一个类去继承它。SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须要在自己定义的类中重写这两个方法,然后分别在这个两个方法中创建、升级数据库的逻辑。

方法参数分析

 public MyDataBaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)
    {
        super(context,name,factory,version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }

SQLiteOpenHelper中有两个构造方法,一般使用参数少的构造方法即可。
context:应用程序环境的信息,即上下文
name:数据库名称
factory:允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null
version:当前数据库的版本号
构建出SQLiteOpenHelper的实例后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了。

具体实例

-创建自定义类,继承SQLiteOpenHelper类

public class MyDataBaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK="create table book("
            +"id integer primary key autoincrement,"
            +"author text,"
            +"price real,"
            +"pages integer,"
            +"name text)";
    private Context mContext;
    public MyDataBaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)
    {
        super(context,name,factory,version);
        mcontext=context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch (oldVersion) {
            case 1:
                db.execSQL(CREATE_CATEGORY);
            case 2:
                db.execSQL("alter table Book add column category_id integer");
                default:

        }

    }
}

-新建布局文件,在布局文件中添加一个按钮即可。
-在MainActivity中实现点击按钮,创建数据库和表的逻辑。

public class MainActivity extends Activity
{
   priavte MyDatabaseHelper dbHelper;
   @override
   protected void onCreate(Bundle savedInstanceState)
   {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,1);
     Button createDatabase=(Button)findViewById(R.id.create_database);
     createDatabase.setOnClickListener(new OnClickListener(){
     @override
     public void onClick(View v)
     {
     dbHelper.getWritableDatabase();
     }
     });
   }
}

首先在onCreate()方法中构建一个MyDatabaseHelper对象,并且通过构造函数的参数将数据库名指定为BookStore.db,版本号为1,点击界面上的按钮,调用getWritableDatabase()方法。
执行的逻辑如下:
点击按钮时,它首先会检测程序中是否有BookStore.db数据库。如果没有,就会创建数据库并调用MyDatabaseHelper中的onCreate()方法。这样表book就会被创建。当第二次点击按钮时,则MyDatabaseHelper中的onCreate()就不会执行了,因为数据库已存在,且也不会创建表。

如何升级数据库呢?

onUpgrade()方法是用于对数据库进行升级的。
假如现在要在数据库中添加一个CATEGORY的表,如何在上述程序上修改呢?
直接在onCreate()方法中添加创建语句是不行的,因为数据库已经存在,OnCreate()方法不会被运行了。那最基础的办法是,我们传入一个高一点的版本号,在onUpgrade运行删除数据库的操作,在点击按钮就可以运行OnCreate()方法了。
传入一个高一点的版本号,就可以让onUpgrade()方法执行

public class MyDataBaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK="create table book("
            +"id integer primary key autoincrement,"
            +"author text,"
            +"price real,"
            +"pages integer,"
            +"name text,"
            +"category_id integer)";

    public static final String CREATE_CATEGORY="create table Category("
            +"id integer primary key autoincrement,"
            +"category_name text,"
            +"category_code integer)";
private Context mContext;
    public MyDataBaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)
    {
        super(context,name,factory,version);
        mContext=context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      db.execSQL("drop table if exists Book");
      db.execSQL("drop table if exists Category");
      onCreate(db);
        }
    }
}

升级数据库的最佳写法

上面的升级数据库的方法是不可取的,因为在现实应用中,数据库包含重要的历史数据,如果全部删除,后果不堪设想。
我们可以这样设想:
每个数据库在升级的时候都会对应一个版本号,当指定的数据库版本号大于当前数据库版本号的时候,就会进行到onUpgrade()方法中去执行更新操作。这里只需要为每一个版本号赋予它各自的更改的内容,然后在onUpgrade()方法中对当前数据库的版本号进行判断,再执行相应的改变就可以了。

public class MyDataBaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK="create table book("
            +"id integer primary key autoincrement,"
            +"author text,"
            +"price real,"
            +"pages integer,"
            +"name text,"
            +"category_id integer)";

    public static final String CREATE_CATEGORY="create table Category("
            +"id integer primary key autoincrement,"
            +"category_name text,"
            +"category_code integer)";

    public MyDataBaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)
    {
        super(context,name,factory,version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch (oldVersion) {
            case 1:
                db.execSQL(CREATE_CATEGORY);
            case 2:
                db.execSQL("alter table Book add column category_id integer");
                default:

        }

    }
}

[1]:参考资料:第一行代码 Android

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值