SQLite数据库介绍:
Android内置的小型的,关系型,文本型数据库。通过SQLiteOpenHelper来实现数据库操作。
特点:应用程序中的任何类可以通过名称来访问数据库。但应用程序之外就不能访问。
SQLiteOpenHelper类介绍:
作用:通过获取到具体数据库的引用来管理数据库(创建,增加,修改,删除)和版本的控制;
使用过程:通过创建继承SQLiteOpenHelper的子类,实现一些方法来执行对数据库的操作,如下实例代码;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, CommDB.DATABASE_NAME, null, CommDB.DATABASE_VERSION);
// CursorFactory设置为null,使用系统默认的工厂类
}
@Override
public void onCreate(SQLiteDatabase db) {
// 这个方法中主要完成创建数据库后对数据库的操作,即便程序修改重新运行,
//只要数据库已经创建过,就不会再进入这个onCreate方法
...
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//调用时机newVersion>oldVersion
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
// 当回调OnUdgrade时,删除旧表,然后调用onCreate来创建新表,
//这样的操作在实际开发中不推荐,正确的做法是在更新数据表结构时,
//还要考虑用户存放于数据库中的数据不丢失。
...
}
}
参数 | 含义 |
---|---|
SQLiteOpenHelper的第一个构造函数参数 | 上下文环境 |
SQLiteOpenHelper的第二个构造函数参数 | 数据库名字 |
SQLiteOpenHelper的第三个构造函数参数 | 游标工厂(可选) |
SQLiteOpenHelper的第四个构造函数参数 | 数据库模型版本号 |
实际开发过程中中:为了更好的管理和维护数据库,封装一个继承自SqliteOpenHelper的数据库操作类,然后以这个类作为基类继续封装我们需要的业务逻辑。
常用方法介绍
方法名 | 功能 |
---|---|
onCreate() | 创建数据库 |
onUpgrate() | 升级数据库 |
close() | 关闭所有打开的数据库对象 |
getWriteableDatabase() | 创建或打开可以读/写的数据库 |
getReadableDatabase() | 创建或打开可以读的数据库 |
(1)onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
(2)onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级或者表结构更新时才需改变版本号,而数据库的版本是由程序员控制的。假设数据库原来的版本是1,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新的一些逻辑操作。
SQLiteDatabase类介绍:
作用:负责执行具体的增删改查操作
常用方法介绍
方法名 | 功能 |
---|---|
execSQL() | 可进行增删改操作,不能进行查询操作(与操作) |
rawQuery() | 可用于执行select语句 |
query() | 查询数据库(读操作) |
insert() | 插入数据 |
delete() | 删除数据 |
(1)一个数据库中可以有多个数据表
利用SQLiteOpenHelper来获取数据库对象
(1) 利用getWriteableDatabase()和getReadableDatabase()获取数据库对象的引用,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。
mDbHelper = new DatabaseHelper(context);
mDb = mDbHelper.getWritableDatabase();
安卓中SQLite的增删改查操作
(1).利用ContentValues作为容器,它实现了Parcelable接口,可序列化,底层是对HashMap的封装。传入参数是必须是Key(String),Value(Object);String对应的是创建表时候的列名。
ContentValues values = new ContentValues();
initialValues.put(KEY_ID, id);
initialValues.put(KEY_PIC_URL, picUrl);
(2).利用SQLiteDatabase类中的insert的方法往指定表名TABLE_NAME传入上一步自己生成的values;通过其返回值判断是否操作成功,返回-1则操作失败,成功则返回最新插入数据的所在的行号;
SQLiteDatabase mDb;
// 采用事务处理,确保数据完整性
mDb.beginTransaction(); // 开始事务
try{
long createResult = mDb.insert(TABLE_NAME, null, values);
db.setTransactionSuccessful(); // 设置事务成功完成
} finally {
db.endTransaction(); // 结束事务
}
notes :try…finally语句块可加可不加。
(1)删除表中全部数据,使用delete()方法,第一个参数是数据表名,第二个参数是条件语句,第三个参数是条件参数;如果第二三个参数为空则删除所有行数据,返回值是删除操作影响的行数。
int deleteResult = mDb.delete(TABLE_NAME, null, null);
(2)根据字段名删除表中的数据
int isDelete;
String[] tName = new String[] {id};
isDelete = mDb.delete(TABLE_NAME, KEY_ID + "=?", tName);
使用ContentValues存储键值对,update语句的第一个参数是数据表名,第二个为你需要更新的对应列和值,第三个参数是条件语句,第四个参数是条件参数
public void updatePicUrl(User user) {
Logger.d("updatePicUrl");
ContentValues values = new ContentValues();
values.put("age", user.getPicUrl());
db.update(TABLE_NAME, values, "id = ?",
new String[] { user.getId(); });
}
使用ArrayList存储POJO类的用户数据,利用Cursor来获取每一行的数据,在后续操作中将其存入ArrayList中;
public Cursor query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy)
参数 | 作用 |
---|---|
table | 数据表名 |
columns | 查询列名 |
selection | 查询条件 |
selectionArgs | 条件参数 |
groupBy | 添加groupBy子句 |
having | 添加having子句 |
orderBytable | 添加orderBy子句 |
Notes:一般简单的操作只要填前四个参数就行
public ArraryList queryAll() {
ArrayList allUsersList = new ArrayList<>();
Cursor mCursor = null;
mCursor = mDb.query(TABLE_NAME, new String[] {KEY_ID,KEY_PIC_URL}, null, null, null, null, null);
if (mCursor.moveToFirst()) {
do {
User user = new User();
user.setId(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_ID)));
user.setPicUrl(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_PIC_URL)));
allUsersList.add(user);
} while (mCursor.moveToNext());
}
if (mCursor != null && !mCursor.isClosed()) {
mCursor.close();
}
return allUsersList;
}
使用样例代码
public class CommDB {
public static final String DATABASE_NAME = "MoveDatabase.db"; //数据库名称
public static final int DATABASE_VERSION = 1;
//创建图像url对应id的表
private static final String CREATE_TABLE_ImgRecords = "create table if not exists" +
ImgRecordsDB.TABLE_NAME + "(" + ImgRecordsDB.KEY_ID +"integer," +
ImgRecordsDB.KEY_PIC_URL +"varchar(200))";
//创建搜索记录表
private static final String CREATE_TABLE_SearchRecords =
"create table if not exists" + SearchRecordsDB.TABLE_NAME + "(" + SearchRecordsDB.KEY_ID +
"integer primary key autoincrement," + SearchRecordsDB.KEY_Content +"varchar(200))";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public CommDB(Context ctx) {
this.context = ctx;
this.DBHelper = new DatabaseHelper(this.context);
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_ImgRecords);//创建图像记录表
db.execSQL(CREATE_TABLE_SearchRecords);//创建搜索记录表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//当提供的新版本号比旧版号大的时候,将会回调该方法
}
}
public CommDB open() throws SQLException {
this.db = this.DBHelper.getWritableDatabase();
return this;
}
public void close() {
this.DBHelper.close();
}
}
public class ImgRecordsDB {
public static final String KEY_ID = "id";
public static final String KEY_PIC_URL = "picUrl";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
public static final String TABLE_NAME = "ImgRecords";
private final Context context;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, CommDB.DATABASE_NAME, null, CommDB.DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Logger.d("Upgrading database from version " + oldVersion + " to " + newVersion +
", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
public ImgRecordsDB(Context ctx) {
this.context= ctx;
}
public ImgRecordsDB open() throws SQLException {
mDbHelper = new DatabaseHelper(context);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
if (mDbHelper != null) {
mDbHelper.close();
}
}
//下面开始封装一些具体的自定义的数据库操作
/**
* 创建一个保存用户id和对应图像url的
* @param id
* @param picUrl
* @return
*/
public long createUser(String id,String picUrl) {
long createResult = 0;
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ID, id);
initialValues.put(KEY_PIC_URL, picUrl);
try {
createResult = mDb.insert(TABLE_NAME, null, initialValues);
Logger.d("the new row is " + createResult);
} catch (Exception e) {
//在这里添加一些自定义的异常处理
Logger.d("delete all data failed!");
e.printStackTrace();
}
return createResult;
}
/**
* 删除表中全部数据
* @return
*/
public boolean deleteAllUsers() {
int deleteResult = 0;
try {
deleteResult = mDb.delete(TABLE_NAME, null, null);
Logger.d(deleteResult+"row has been deleted!");
} catch (Exception e) {
//在这里添加一些自定义的异常处理
e.printStackTrace();
}
return deleteResult > 0;
}
/**
* 根据名称删除表中的数据
* @param id
* @return
*/
public boolean deleteUserByID(String id) {
int isDelete;
String[] tName = new String[] {id};
isDelete = mDb.delete(TABLE_NAME, KEY_ID + "=?", tName);
Logger.d("isDelete:" + isDelete + "---" + "UserID = " + id);
return isDelete > 0;
}
/**
* 获取表中的所有字段
* @return
*/
public ArrayList queryAll() {
ArrayList allUsersList = new ArrayList<>();
Cursor mCursor = null;
mCursor = mDb.query(TABLE_NAME, new String[] {KEY_ID,KEY_PIC_URL}, null, null, null, null, null);
if (mCursor.moveToFirst()) {
do {
User user = new User();
user.setId(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_ID)));
user.setPicUrl(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_PIC_URL)));
allUsersList.add(user);
} while (mCursor.moveToNext());
}
if (mCursor != null && !mCursor.isClosed()) {
mCursor.close();
}
return allUsersList;
}
}
目前还处于更新状态,不足之处,请谅解