1、SQLite的使用要紧抓SQLiteOpenHelper类
SQLiteOpenHelper是一个辅助类,管理数据库(创建、增、修、删) & 版本的控制。
在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。
方法名 | 作用 |
---|---|
onCreate() | 创建数据库 |
onUpgrade() | 升级数据库 |
close() | 关闭所有打开的数据库对象 |
execSQL() | 可进行增删改操作, 不能进行查询操作 |
query()、rawQuery() | 查询数据库 |
insert() | 插入数据 |
delete() | 删除数据 |
getWritableDatabase() | 创建或打开可以读/写的数据库 |
getReadableDatabase() | 创建或打开可读的数据库 |
2、SQLite使用
2.1、特别注意
2.1.1、对于“增、删、改”这类操作,首先调用getWritableDatabase()获得一个可读写数据库的对象,然后在调用通用的execSQL(String sql) 或对应的操作API方法:insert()、delete()、update()
2.1.2、对“查”,首先调用getReadableDatabase()获得一个可读的数据库对象,然后使用query()或rawQuery()方法查询数据库不能使用execSQL方法
2.2、创建数据库
MySQLiteHelper .java
public class MySQLiteHelper extends SQLiteOpenHelper {
public MySQLiteHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 第一次创建数据库的时候回调该方法
* 当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法;
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(name varchar(10))";
//execSQL用于执行SQL语句完成数据库的创建
db.execSQL(sql);
//数据库实际上是没有被创建或者打开,
//直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//这里是更新数据库的
}
}
因为我的操作比较多,我特意创建了一个控制类,如果嫌麻烦可以直接在Activity中操作
DataBaseControl.java
public class DataBaseControl {
private String DbName = "bd.db";
public DataBaseControl(Context context) {
MySQLiteHelper mySqliteHelper = new MySQLiteHelper(context, DbName, null, 1);
//调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
SQLiteDatabase database = mySqliteHelper.getWritableDatabase();
//SQLiteDatabase database = mySqliteHelper.getReadableDatabase();
}
}
2.3、插入数据
因为要写入数据所以需要使用读写功能的getWritableDatabase()
插入数据可以使用insert()也可以使用excelSQL()
DataBaseControl.java
public DataBaseControl(Context context) {
MySQLiteHelper mySqliteHelper = new MySQLiteHelper(context, DbName, null, 1);
//调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
SQLiteDatabase database = mySqliteHelper.getWritableDatabase();
//创建ContentValues对象
//注:ContentValues内部实现就是HashMap,但是两者还是有差别的
//ContentValues Key只能是String类型,Value只能存储基本类型数据,不能存储对象
ContentValues values = new ContentValues();
// 向该对象中插入键值对
values.put("name", "张三");
// 调用insert()方法将数据插入到数据库
// 第一个参数:要操作的表名称
// 第二个参数:SQl不允许一个空列,如果ContentValues是空的,那么这一列被明确的指明为NULL值
// 第三个参数:ContentValues对象
database.insert("user", null, values);
//也可以直接使用下面方法
//database.execSQL("insert into user (name) values ('张三')");
}
2.4、删除数据
删除数据也需要使用getWritableDatabase()
删除可使用delete()也可以使用excelSQL()
DataBaseControl.java
public DataBaseControl(Context context) {
MySQLiteHelper mySqliteHelper = new MySQLiteHelper(context, DbName, null, 1);
//调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
SQLiteDatabase database = mySqliteHelper.getWritableDatabase();
//调用delete方法进行删除操作
//第一个参数String:需要操作的表名
//第二个参数String:where选择语句, 选择哪些行要被删除, 如果为null, 就删除所有行;
//第三个参数String[]: where语句的参数, 逐个替换where语句中的 "?" 占位符;
database.delete("user", "id=?", new String[]{"1"});
//也可以直接使用下面方法
//database.execSQL("DELETE FROM user WHERE name = '张三'");
}
2.5、修改数据
修改数据需要使用getWritableDatabase()
修改数据可用update()也可以使用execSQL()
DataBaseControl.java
public DataBaseControl(Context context) {
MySQLiteHelper mySqliteHelper = new MySQLiteHelper(context, DbName, null, 1);
//调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
SQLiteDatabase database = mySqliteHelper.getWritableDatabase();
// 创建一个ContentValues对象
ContentValues values = new ContentValues();
values.put("name", "李四");
// 调用update方法修改数据库
// 第一个参数String:表名
// 第二个参数ContentValues:ContentValues对象(需要修改的)
// 第三个参数String:WHERE表达式,where选择语句, 选择那些行进行数据的更新, 如果该参数为 null, 就会修改所有行;?号是占位符
// 第四个参数String[]:where选择语句的参数, 逐个替换 whereClause 中的占位符;
database.update("user", values, "id=?", new String[]{"1"});
//也可以直接使用下面方法
//database.execSQL("UPDATE user SET name = '李四' WHERE id=1");
}
2.6、查询数据
查询数据只需要可读就行所以使用getReadableDatabase(),当然如果你的操作不仅仅是查询的话还是建议使用getWritableDatabase()
然后使用query() 或 rawQuery()
DataBaseControl.java
//distinct可以指定“true”或“false”表示要不要过滤重复值
//table:要操作的表明
//columns:查询的列所有名称集
//selection:WHERE之后的条件语句,可以使用占位符
//groupBy:指定分组的列名
//having指定分组条件,配合groupBy使用
//orderBy指定排序的列名
//limit指定分页参数
database.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
//这种最简单 直接使用SQL语句 selectionArgs(占位符代替实际参数)可以直接填null
database.rawQuery(String sql, String[] selectionArgs);
//所有查询都会返回一个Cursor对象
//Cursor对象常用方法如下:
cursor.move(int offset); //以当前位置为参考,移动到指定行
cursor.moveToFirst(); //移动到第一行
cursor.moveToLast(); //移动到最后一行
cursor.moveToPosition(int position); //移动到指定行
cursor.moveToPrevious(); //移动到前一行
cursor.moveToNext(); //移动到下一行
cursor.isFirst(); //是否指向第一条
cursor.isLast(); //是否指向最后一条
cursor.isBeforeFirst(); //是否指向第一条之前
cursor.isAfterLast(); //是否指向最后一条之后
cursor.isNull(int columnIndex); //指定列是否为空(列基数为0)
cursor.isClosed(); //游标是否已关闭
cursor.getCount(); //总数据项数
cursor.getPosition(); //返回当前游标所指向的行数
cursor.getColumnIndex(String columnName);//返回某列名对应的列索引值
cursor.getString(int columnIndex); //返回当前行指定列的值
具体的使用如下:
DataBaseControl.java
public DataBaseControl(Context context) {
MySQLiteHelper mySqliteHelper = new MySQLiteHelper(context, DbName, null, 1);
//调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
SQLiteDatabase database = mySqliteHelper.getWritableDatabase();
// 第一个参数String:表名
// 第二个参数String[]:要查询的列名
// 第三个参数String:查询条件
// 第四个参数String[]:查询条件的参数
// 第五个参数String:对查询的结果进行分组
// 第六个参数String:对分组的结果进行限制
// 第七个参数String:对查询的结果进行排序
Cursor cursor = database.query("user", new String[] {"name" }, "id=?",
new String[] { "1" }, null, null, null);
//利用光标移动,判断结果集是否还有下一条数据
while (cursor.moveToNext()) {
name = cursor.getString(cursor.getColumnIndex("name"));
}
cursor.close();//记得一定关闭它哦
//---------------------------------------------------------------------------
//rawQuery直接传入SQL就好
Cursor cursor = database.rawQuery(sql, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
list.add(new user(cursor.getInt(0), cursor.getString(1)));
}
cursor.close();//记得一定关闭它哦
//在此说明上下两种遍历方式都可以使用,当然也有其他方式,具体用什么方式看个人习惯
}
2.7、数据库更新
MySQLiteHelper.java
//数据库版本号
private static final int DATABASE_VERSION = 1;
//oldVersion : 旧版本数据库
//newVersion : 新版本数据库
//注意:这里的删除等操作必须要保证新的版本必须要比旧版本的版本号要大才行。
//[即 Version 2.0 > Version 1.0 ] 所以这边我们不需要对其进行操作。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//这里是更新数据库的
}
DataBaseControl.java
public DataBaseControl(Context context) {
//创建SQLiteOpenHelper子类对象的时候,必须传入一个version参数
//该参数就是当前数据库版本, 只要这个版本高于之前的版本, 就会触发这个onUpgrade()方法,如下面代码
//注意,一定要传入最新的数据库版本号
//传入版本号为2,大于旧版本(1),所以会调用onUpgrade()升级数据库
MySQLiteHelper mySqliteHelper = new MySQLiteHelper(context, DbName, null, 2);
//调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
SQLiteDatabase database = mySqliteHelper.getWritableDatabase();
}
2.8、关闭数据库
DataBaseControl.java
public DataBaseControl(Context context) {
MySQLiteHelper mySqliteHelper = new MySQLiteHelper(context, DbName, null, 1);
//调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
SQLiteDatabase database = mySqliteHelper.getWritableDatabase();
//关闭当前数据库
database.close();
}
3、个人建议
个人建议都是用SQL语句,SQL语句比较通用,insert()、delete()、query()方法参数多,使用复杂