一、SQLiteOpenHelper类
1、基本介绍:
SQLiteOpenHelper类是Android提供的用于操作SQLite数据库的工具类,该工具类能管理数据库(创建、增、修、删) & 版本的控制。使用过程:通过创建子类继承SQLiteOpenHelper类,实现它的一些方法来对数据库进行操作。
在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。
2、SQLiteOpenHelper类的数据库操作方法介绍
方法名 | 作用 |
---|---|
onCreate() | 创建数据库(创建数据库时自动调用) |
onUpgrade() | 升级数据库 |
close() | 关闭所有打开的数据库对象 |
execSQL() | 可进行增删改操作, 不能进行查询操作 |
query()、rawQuery() | 查询数据库 |
insert() | 插入数据 |
delete() | 删除数据 |
getWritableDatabase() | 创建或打开可以读/写的数据库(通过返回的SQLiteDatabase对象对数据库进行操作) |
getReadableDatabase() | 创建或打开可读的数据库(同上) |
二、常见数据库使用
数据库操作无外乎:“增删查改”:
1、 对于“增、删、改(更新)”这类对表内容变换的操作,需先调用getWritableDatabase()获得一个可写数据库对象,在执行的时候调用通用的execSQL(String sql)或或对应的操作API方法:insert()、delete()、update()
2、对“查”,需要调用getReadableDatabase()获得一个可读的数据库对象,然后使用query()或rawQuery()方法
查询数据库不能使用execSQL方法
三、数据库操作
1、创建数据库
涉及的方法有onCreate()、getWritableDatabase()、getReadableDatabase()
具体代码如下:
MySQLiteOpenHelper是SQLiteOpenHelper的子类:
MySQLiteOpenHelper.java:
/**
* 第一次创建数据库的时候回调该方法
* 当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法;
*作用:创建数据库表:将创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面;
*/
@Override
public void onCreate(SQLiteDatabase db) {
//SQLite数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型
//创建了一个名为person的表
String sql = "create table if not exists person("
+ "pid integer primary key autoincrement,"
+ "pname varchar(20)," + "phone varchar(11))";
//execSQL用于执行SQL语句
//完成数据库的创建
db.execSQL(sql);
//数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开
//见下代码
}
SQLiteActivity01:
@Override
public void onClick(View v) {
// 创建MySQLiteOpenHelper对象
// 只执行这句话是不会创建或打开连接的
MySQLiteOpenHelper helper = new MySQLiteOpenHelper(
SQLiteActivity01.this);
// 调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
helper.getWritableDatabase();// 获取数据库
}
});
2、插入数据
步骤:创建并打开数据库(可读/写)、插入数据
涉及方法:getWritableDatabase()、insert()
insert()也可以使用excelSQL()代替
具体代码如下:
Button btnAdd = (Button) findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(this);
public void onClick(View v) {
//创建MySQLiteOpenHelper对象
MySQLiteOpenHelper helper = new MySQLiteOpenHelper(
SQLiteActivity02.this);
// 获取控件ID
String sql = null;
switch (v.getId()) {
case R.id.btnAdd:
sql = "insert into person(pname,phone) values(?,?)";
helper.execUpdate(sql, new Object[] { "张三丰", "13800000000" });
Toast.makeText(SQLiteActivity02.this, "数据添加成功", Toast.LENGTH_LONG)
.show();
break;
3、修改数据(升级数据库)
/**
* 参数:数据库,旧版本数据库,新版本数据库
* 作用:更新数据库表结构
调用时机:数据库版本发生变化的时候回调(取决于数据库版本)
创建SQLiteOpenHelper子类对象的时候,必须传入一个version参数
该参数就是当前数据库版本, 只要这个版本高于之前的版本, 就会触发这个onUpgrade()方法,如下面代码
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 增加email字段 使用SQL的ALTER语句
db.execSQL("alter table person add email varchar(30");
}
case R.id.btnUpdate:
sql = "update person set pname =?,phone=?where pid=?";
helper.execUpdate(sql, new Object[] { "张无忌", "13800000000", 1 });
Toast.makeText(SQLiteActivity02.this, "数据修改成功", Toast.LENGTH_SHORT)
.show();
break;
//删除等操作需要当此处版本号比旧版本号大些才能进行操作
4、删除数据
/**
* 执行添加、删除、修改的数据操作
* @param sql
* @param params where语句的参数, 逐个替换where语句中的 "?" 占位符
*/
public void execUpdate(String sql, Object[] params) {
// 调用getWritableDatabase()方法创建或打开一个可以读的数据库
//通过返回的SQLiteDatabase对象对数据库进行操作
SQLiteDatabase dataBase = getWritableDatabase();
dataBase.execSQL(sql, params);
}
sql = "delete from person where pid = ?";
helper.execUpdate(sql, new Object[] { 1 });
5、查询数据
public String execQueryById(String sql, String[] params) {
SQLiteDatabase dataBase = getWritableDatabase();
String result = "";// 查询返回的结果串
// 执行查询语句,返回游标对象
Cursor cursor = dataBase.rawQuery(sql, params);
// 获取游标对象中的结果
if (cursor.moveToFirst()) {
// 获取列的标号
String pid = cursor.getString(cursor.getColumnIndex("pid"));
result += pid;
String pname = cursor.getString(cursor.getColumnIndex("pname"));
result += pname;
String phone = cursor.getString(cursor.getColumnIndex("phone"));
result += phone;
}
return result;
}
sql = "select * from person where pid = ?";
String res = helper.execQueryById(sql, new String[] { "2" });
Toast.makeText(SQLiteActivity02.this, res, Toast.LENGTH_LONG).show();
TextView tv = (TextView) findViewById(R.id.tvInfo);
tv.setText(res);
a、android.database.sqlite.SQLiteDatabase类的实例都代表了一个SQLite数据库的操作,通过SQLiteDatabase类可以执行SQL语句,以完成对数据表的增加、修改、删除、查询等操作,在此类之中定义了基本的数据库执行SQL语句的操作方法以及一些操作的模式常量。
b、ContentValues类包装了HashMap类,该类用于存取键值对的数据,每个键值对表示一列的列名和该列的数据。