一、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 FROMuser_info WHEREname = '张三';
修改记录
UPDATE user_info SET height = 188 WHEREname = '张三';
查询记录
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中创建表
// 创建数据库,执行建表语句@Overridepublic 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=1return 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;@Overrideprotected 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");}});}@Overrideprotected void onStart() {super.onStart();mHelper = UserDBHelper.getInstance(this);
// 打开数据库读写连接mHelper.openWriteLink();mHelper.openReadLink();}@Overrideprotected 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 改变时给表添加两个字段
@Overridepublic 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代码案例