引言
- 如果你想要新建一个数据库,那么你一定会用到SQLiteOpenHelper;
- 如果你已经有了数据库,但是你想要操作数据库里面表中的数据,进行CRUD操作,那么你一定会用到SQLiteOpenHelper;
- 如果你已经有了数据库,但是想要升级数据库,改变数据库中表的结构,那么你一定会用到SQLiteOpenHelper……
总之,凡是你想要在程序里面对数据库进行相关操作(CRUD等)都必须通过SQLiteOpenHelper。
正文
在使用前,你必须知道的知识点:
1.SQLiteOpenHelper是抽象类,意味着要使用的话必须创建一个自己的类去继承它(这也是抽象类存在的意义),并且实现两个抽象方法:
- onCreate():在这里写创建数据库的语句。
- onUpgrade():在这里实现升级数据库的逻辑。
tips:两个方法中参数均包含了SQLiteDatabase引用.
2.在SQLiteOpenHelper的构造函数里指定你要创建或者访问的数据库名,数据库版本号(升级数据库用)。构造函数有两个,一般用参数少的那个即可。其中重要的两个参数就是上面所述.
3.SQLiteOpenHelper中有两个重要的实例方法getReadableDatebase()和getWritableDatabase(),除了数据库不可写入的情况,其他情况下二者相同,都能得到对数据库操作对象(数据库对应SQLiteOpenHelper中参数传入的那个).
getReadableDatebase()
getWritableDatabase()
4.onCreate()方法和onUpgrade()方法不是由程序员直接调度的(虽然你直接调度貌似也可以,但是不是这么用的),而是虚拟机调度的,所以要知道这两个方法的调度时机.
- onCreate(): 程序员调用getWitableDatabase(或者getReadableDatabase)且本地还没有对应的数据库(2个条件).
- onUpgrade():程序员调用getWitableDatabase(或者getReadableDatabase)且本地已经有对应的数据库但是版本低于新版本,版本号在SQLiteOpenHelper的构造函数参数里设置(三个条件).
代码示例:
/*1.写一个类继承SQLiteOpenHelper*/
package com.sunday.goodhobby.goodhobby.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by Administrator on 2016/7/21.
*/
public class MyDBHelper extends SQLiteOpenHelper{
//上下文实例
private final Context mCtx;
//这是要执行的sql语句,一般都是建表语句
public static final String create_hobby="create table hobby("+"id integer primary key autoincrement,"+"name text,"+"grade text)";
//在构造函数传入数据库名和数据库版本号
private MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mCtx=context;
}
@Override
public void onCreate(SQLiteDatabase db ) {
//执行sql语句,无论是开发阶段还是产品已经成熟阶段,这里都是写建表语句;而且这里应该用当前最新的数据库结构来建表
db.execSQL(create_hobby);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//开发阶段的做法是:将原来的表全部删除,执行onCreate方法;正确的做法是:根据原来的版本,赋予每个数据库版本各自的内容(用switch语句,case后面无break)
}
/*2.创建对象*/
/*3.调用SQLiteOpenHelper的get方法的到操作数据库的实例*/
/*4.用数据库操作实例执行想要执行的sql语句*/
总结:
宏观上使用顺序:
新建类继承SQLiteOpenHelper-> 创建对象SQLiteOpenHelper(在此传入数据库名,版本号)->调用getWritableDatabase方法得到SQLiteDataBase对象->通过SQLiteDataBase对象执行sql语句.
延伸思考:
1. 一个app中SQLiteOpenHelper实例有必要需要多个吗?其实在一个app中只需要单个实例就足够了,所以应该将SQLiteOpenHelper写成SINGELTON模式.
2. 一个app是怎么实现升级的(如何提醒用户升级,使用什么方式升级,是将旧版本删除再下载新版本安装还是增量升级,只更新改变的那一部分,怎么实现)
友情提醒:要深入全面的学习请看官方的帮助文档,新手入门推荐书籍
<第一行代码>