安卓数据存储——SQLite
一、SQLite数据库
创建表
CREATE TABLE IF NOT EXISTS user_info (
_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
name VARCHAR NOT NULL,
age INTEGER NOT NULL,
height LONG NOT NULL,
weight FLOAT NOT NULL
);
注:
- IF NOT EXISTS:如果该表不存在则创建,若存在该表则不创建
- AUTOINCREMENT:自动增长
- sqlite数据库不支持布尔类型,如果直接存布尔类型会被自动转为数字 0(false)、1(true)
删除表
DROP TABLE IF EXISTS user_info;
注:
- IF EXISTS:如果该表存在则删除
修改表结构
ALTER TABLE user_info ADD COLUMN phone VARCHAR;
注:
- sqlite只支持增加字段,不支持修改、删除字段
- sqlite每次只能添加一个字段,若要添加多个字段,需分多次添加
添加记录
INSERT INTO user_info ( name, age, height, weight, phone )
VALUES
( '张三', 18, 180, 70.2, 1101201120 );
删除记录
DELETE
FROM
user_info
WHERE
name = '张三';
修改记录
UPDATE user_info
SET height = 188
WHERE
name = '张三';
查询记录
SELECT * FROM user_info ORDER BY age ASC;
注:
ORDER BY:根据age字段排序
ASC:升序
DESC:降序
二、SQLiteDatabase数据库管理器
SQLiteDatabase是SQLite的数据库管理类,它提供了若干操作数据表的API,常用的方法有3类。
管理类主要API
- openDatabase:打开指定路径的数据库
- isOpen:判断数据库是否已打开
- close:关闭数据库
- getVersion:获取数据库的版本号
- setVersion:设置数据库的版本号
创建数据库
String mDatabaseName = getFilesDir() + "/test.db";
SQLiteDatabase db = openOrCreateDatabase(mDatabaseName, Context.MODE_PRIVATE, null);
删除数据库
boolean result = deleteDatabase(mDatabaseName);
案例代码
注:
- getFilesDir():返回该包下的files路径(/data/data/包名/files/)
三、SQLiteOpenHelper数据库帮助器
SQLiteOpenHelper是Android提供的数据库辅助工具,用于指导开发者进行SQLite的合理使用。
数据处理类主要API
- execSQL:执行拼接好的SQL语句
- delete:删除符合条件的记录
- update:更新符合条件的记录
- insert:插入一条记录
- query:执行查询操作,返回结果集的游标
- rawQuery:执行拼接好的SQL查询语句,返回结果集的游标
创建步骤
- 新建一个继承自SQLiteOpenHelper的数据库操作类,提示重写onCreate和onUpgrade两个方法。
- 封装保证数据库安全的必要方法
- 提供对表记录进行增加、删除、修改、查询的操作方法。
public class UserDBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "user.db";
private static final String TABLE_NAME = "user_info";
private static final int DB_VERSION = 1;
private static UserDBHelper mHelper = null;
private SQLiteDatabase mRDB = null;
private SQLiteDatabase mWDB = null;
private UserDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
//单例
public static UserDBHelper getInstance(Context context) {
if (mHelper == null) {
mHelper = new UserDBHelper(context);
}
return mHelper;
}
}
在onCreate中创建表
// 创建数据库,执行建表语句
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "name VARCHAR NOT NULL);";
db.execSQL(sql);
}
SQLiteDatabase对数据库操作分为读和写,所以要提供两个实例
private SQLiteDatabase mRDB = null;
private SQLiteDatabase mWDB = null;
读连接:getReadableDatabase()
public SQLiteDatabase openReadLink() {
if (mRDB == null || !mRDB.isOpen()) {
mRDB = mHelper.getReadableDatabase();
}
return mRDB;
}
写连接:getWritableDatabase()
public SQLiteDatabase openWriteLink() {
if (mWDB == null || !mWDB.isOpen()) {
mWDB = mHelper.getWritableDatabase();
return mWDB;
}
return mWDB;
}
关闭连接
public void closeLink() {
if (mRDB != null && mRDB.isOpen()) {
mRDB.close();
mRDB = null;
}
if (mWDB != null && mWDB.isOpen()) {
mWDB.close();
mWDB = null;
}
}
添加
public long insert(User user) {
ContentValues values = new ContentValues();
values.put("name", user.name);
//执行插入记录动作,该语句返回插入记录的行号
//如果第三个参数values 为Null或者元素个数为0, 由于insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,
//为了满足SQL语法的需要, insert语句必须给定一个字段名 ,如:insert into person(name) values(NULL),
//倘若不给定字段名 , insert语句就成了这样: insert into person() values(),显然这不满足标准SQL的语法。
//如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null 。
return mWDB.insert(TABLE_NAME, null, values);
}
删除
public long deleteByName(User user) {
// 删除多个 name=? and age=?
// 删除所有 1=1
return mWDB.delete(TABLE_NAME, "name=?", new String[]{user.name});
}
修改
public long update(User user) {
ContentValues values = new ContentValues();
values.put("name", user.name);
return mWDB.update(TABLE_NAME, values, "name=?", new String[]{user.name});
}
查询
public List<User> queryAll() {
List<User> list = new ArrayList<>();
Cursor cursor = mRDB.query(TABLE_NAME, null, null, null, null, null, null);
while (cursor.moveToNext()) {
User user = new User();
user.id = cursor.getInt(0);
user.name = cursor.getString(1);
list.add(user);
}
return list;
}
注:
- Cursor:游标
使用
public class SQLiteHelperActivity extends : {
private UserDBHelper mHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite_helper);
Button save = findViewById(R.id.save);
save.setOnClickListener(view -> {
User user = new User("张三");
// 插入
// long res = mHelper.insert(user);
// 删除
// long res = mHelper.deleteByName(user);
// 修改
// long res = mHelper.update(user);
// 查询
List<User> list=mHelper.queryAll();
for(User u: list){
Log.d("AAA",u.toString());
}
if (res > 0) {
ToastUtil.show(this, "success");
}
});
}
@Override
protected void onStart() {
super.onStart();
mHelper = UserDBHelper.getInstance(this);
// 打开数据库读写连接
mHelper.openWriteLink();
mHelper.openReadLink();
}
@Override
protected void onStop() {
super.onStop();
mHelper.closeLink();
}
}
事务
事务类主要API
- beginTransaction:开始事务
- setTransactionSuccessful:设置事务的成功标志
- endTransaction:结束事务
public long insert(User user) {
ContentValues values = new ContentValues();
values.put("name", user.name);
try {
//开始一个事务
mWDB.beginTransaction();
mWDB.insert(TABLE_NAME, null, values);
mWDB.insert(TABLE_NAME, null, values);
//标记事务成功
mWDB.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
//标记事务结束
mWDB.endTransaction();
}
return 1;
}
数据库更新
private static final int DB_VERSION = 1;
private UserDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
当 DB_VERSION 改变时给表添加两个字段
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN phone VARCHAR;";
db.execSQL(sql);
sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN password VARCHAR;";
db.execSQL(sql);
}
UserDBHelper代码案例