使用 SQLite 保存数据 | Android Developers (google.cn)
SQLiteOpenHelper 类包含一组用于管理数据库的实用 API。当您使用此类获取对数据库的引用时,系统仅在需要时才执行可能需要长时间运行的数据库创建和更新操作,而不是在应用启动期间执行。您仅需调用 getWritableDatabase() 或 getReadableDatabase() 即可。
注意 :由于这些操作可能会长时间运行,因此请务必在后台线程中调用 getWritableDatabase() 或 getReadableDatabase()。
这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)。
getReadableDatabase()方法返回的对象将以只读的方式去打开数据库
getWritableDatabase()方法则将出现异常
创建一个数据库管理类继承 SQLiteOpenHelper,并重写其中的方法
- onCreate() 创建数据库
- onUpgrade() 数据库升级
- onDowngrade() 和 onOpen() 并不是必须
准备数据库框架
准备表名、列名
// ----表名
public static final String STUTDY_SQLITE_TABLE = "STUTDY_SQLITE_TABLE";
// ----列名
public static final String COLUNM_ID = "ID";
public static final String COLUNM_NAME = "COLUNM_NAME";
public static final String COLUNM_PHONE = "COLUNM_PHONE";
public static final String COLUNM_PASSWORD = "COLUNM_PASSWORD";
创建数据库 onCreate()
// 第一次尝试访问数据库对象时会调用该方法创建新表
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// 创建新表的语句
String createNewTableSqlStr = "CREATE TABLE " + STUTDY_SQLITE_TABLE + " (ID INTEGER
PRIMARY KEY AUTOINCREMENT," + COLUNM_NAME + " TEXT," + COLUNM_PHONE + " TEXT," +
COLUNM_PASSWORD + " TEXT)";
sqLiteDatabase.execSQL(createNewTableSqlStr);
}
修改数据库 onUpgrade()
// 当数据库的版本号发生变化时会调用该方法
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
CRUD 操作
C-添加
public long insert(String table, String nullColumnHack, ContentValues values)
参数1:表名
参数2:将指示框架在 ContentValues 为空(即您没有 put 任何值)时应执行哪些操作
参数3:内容
通过将 ContentValues 对象传递给 insert() 方法,将数据插入到数据库中, 方法会返回新创建行的 ID;如果在插入数据时出错,会返回 -1。如果数据与数据库中已有的数据之间存在冲突,就会出现这种情况。
public boolean addOne(UserBean userBean) {
//获取要编写的唯一一个数据库
/* getWritableDatabase SQLiteOpenHelper中的方法*/
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
// 有点像flutter里的键值对
ContentValues cv = new ContentValues();
cv.put(COLUNM_NAME, userBean.getName());
cv.put(COLUNM_PHONE, userBean.getPhone());
cv.put(COLUNM_PASSWORD, userBean.getPassWord());
long insert = sqLiteDatabase.insert(STUTDY_SQLITE_TABLE, null, cv);
return insert != -1;
}
R-查询
使用 query() 方法,向其传递选择条件和所需的列。
该方法合并了 insert() 和 update() 元素,查询结果会包含在 Cursor 对象中返回。
Cursor对象是查询的结果集
public Cursor query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy, String limit)
- table:表名
- columns:指定要查询的列,如果为空则返回所有列
- selection:指定查询条件,使用占位符 ?
- selectionArgs:查询条件具体的值
- groupBy:指定分组方式
- having:指定having方式
- orderBy:指定排序方式
- limit:限制查询返回的行数
使用rawQuery()方法
public Cursor rawQuery(String sql, String[] selectionArgs)
- sql:查询语句
- selectionArgs:查询条件
// 从数据库中查询
String querySqlStr = "SELECT * FROM " + STUTDY_SQLITE_TABLE;
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase(); //可读
Cursor cursor = sqLiteDatabase.rawQuery(querySqlStr, null);
U-修改
使用 update() 方法.
更新表可将 insert() 的 ContentValues 语法与 delete() 的 WHERE
语法相结合。
update() 方法的返回值是数据库中受影响的行数.
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
- table:表名
- values:更新的值
- whereClause:可选的更新条件
- whereArgs:更新条件的值
public boolean updataInfo(UserBean userBean) {
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUNM_NAME, userBean.getName());
cv.put(COLUNM_PHONE, userBean.getPhone());
cv.put(COLUNM_PASSWORD, userBean.getPassWord());
int result = sqLiteDatabase.update(STUTDY_SQLITE_TABLE, cv, "ID = ?", new String[]{String.valueOf(userBean.getId())});
return result > 0;
}
D-删除
需从表中删除行,您需要提供选择条件,以标识 delete() 方法的目标行。该机制与 query() 方法的目标选择参数的工作方式相同
delete() 方法的返回值表示从数据库中删除的行数。
public int delete(String table, String whereClause, String[] whereArgs)
- table:表名
- whereClause:可选的更新条件
- whereArgs:更新条件的值
public boolean deleteOne(UserBean userBean) {
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
System.out.println("要删除的id:" + userBean.getId());
/* 删除语句返回的是受影响的行数
* 行数>0返回true 否则返回false */
int result = sqLiteDatabase.delete(STUTDY_SQLITE_TABLE, COLUNM_ID + " = ?", new String[]{String.valueOf(userBean.getId())});
return result > 0;
}
保留数据库连接
由于在数据库关闭时,调用 getWritableDatabase() 和 getReadableDatabase() 的成本比较高,因此只要有可能需要访问数据库,就应保持数据库连接处于打开状态。通常情况下,最好在发出调用的 Activity 的 onDestroy() 中关闭数据库。
@Override
protected void onDestroy() {
dbHelper.close();
super.onDestroy();
}