这里我们牵扯到两个类,第一个是操作数据库的,第二个是操作表的
一、操作数据库类:SqliteOpenHelper
构造方法:SQLiteOpenHelper
public SQLiteOpenHelper(@Nullable Context context, @Nullable String name,
@Nullable CursorFactory factory, int version) {
Context context:上下文String name:数据库文件名称int version:数据库的版本
onCreate 方法:用于创建数据库
public abstract void onCreate(SQLiteDatabase db);
SQLiteDatabase db:要创建的数据库- 创建数据库的条件:
- 没有数据库。
- 建立连接的时候。
onUpgrade 方法:用于更新数据库的版本
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
SQLiteDatabase db:数据库int oldVersion:旧的版本int newVersion:新的版本- 在调用构造方法的时候,如果新的版本号和上次不一样就会自动调用该方法。可以在该方法里面执行数据库升级语句。
getReadableDatase 方法:获取数据库的连接(读)
public SQLiteDatabase getReadableDatabase()
- 返回数据库连接对象:SQLiteDatabase
- 当手机空间不足的时候,添加数据抛出异常
getWritableDatabase 方法:获取数据库的连接(写)
public SQLiteDatabase getWritableDatabase()
- 返回数据库连接对象:SQLiteDatabase
- 当手机空间不足的时候,毫无反应
二、数据表操作方法类:SQLiteDatabase
insert:添加数据到数据表中去。
public long insert(String table, String nullColumnHack, ContentValues values)
String table:要插入数据的表名称String nullColumnHack:这里可以nullContentValues values:这里是要添加的数据- 例如:添加一个name=zhangsan,age=18的数据
ContentValues values = new ContentValues();
values.put("name","zhangsan");
values.put("age",18);
long person = writableDatabase.insert("tableName", null, values);
update:更新数据表的数据
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
String table:要更新数据的表名称String whereClaus:这里是更新的条件String[] whereArgs:这是更新条件对应的值。- 例如:更新_id为3的数据,年龄修改为28,其他不变。
ContentValues values = new ContentValues();
values.put("age",28);
writableDatabase.update("tableName",values,"_id=?",new String[]{"1"});
delete:删除数据表的数据
public int delete(String table, String whereClause, String[] whereArgs)
String table:要删除数据的表名称String whereClause:删除条件String[] whereArgs:删除条件对应的参数- 例如:删除_id=2的数据。
writableDatabase.delete("tableName","_id=?",new String[]{"2"});
query:查询数据表的结果
public Cursor query(boolean distinct, String table, String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit)
- 案例:其他默认条件的情况下。
Cursor query = readableDatabase.query("tableName", null, null, null, null, null, null);
while (query.moveToNext()) { //将游标移动到下一条记录的前面
int nameIndex = query.getColumnIndex("name"); //根据句字段的名称对应查询的下标
String name = query.getString(nameIndex); //根据句字段的下标得到对应值
int ageIndex = query.getColumnIndex("age");
Integer age = query.getInt(ageIndex);
Log.d(TAG, "查询的姓名:" + name + ",age = " + age);
}
execSql:执行数据表的操作sql语句
public void execSQL(String sql)
String sql:要执行的sql语句。
事务
writableDatabase.beginTransaction();
try {
writableDatabase.insert("tableName", null, values1);
Integer a = 10/0;
writableDatabase.insert("tableName", null, values2);
writableDatabase.setTransactionSuccessful();
Log.d(TAG, "数据添加成功");
} catch (Exception e) {
Log.d(TAG, "数据添加失败:"+e.getMessage());
}finally {
//结束事务,根据上面的结果,提交或者滚回事务。
writableDatabase.endTransaction();
}
开启事务
public void beginTransaction()
设置事务为成功
public void setTransactionSuccessful()
结束事务,提交或者回滚
public void endTransaction()
openDatabase 得到数据库的连接
public static SQLiteDatabase openDatabase(@NonNull String path, @Nullable CursorFactory factory, @DatabaseOpenFlags int flags)
Cursor:查询结果集
匹配查询结果总数据
public int getCount();
将游标移动到下一条记录的前面
public boolean moveToNext();
根据句字段的下标得到对应值
Xxx getXxx(columnIndex);
根据句字段名称得到对应的小标
int getColumnIndex(columnname)