继上一篇我们将初始化工作做好之后,正式开始对于数据库增删改查一系列的函数定义
在开始之前,我们下文会提到一个类:ContentValues,这个是类似于HashMap的一个东西,键对应一个值,添加和查询都需要ContentValues
增:
由于之前定义了所有数据以data的形式,所以这里我们只需要在insert函数中传入Data参数即可:
public void insert(Data data){
}
然后由于要写入数据,所以这里需要调用getWriteableDatabase(),顺带把ContentValues的键值一一对应:
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(colName1, data.getName());
cv.put(colName2, data.getAge());
这里我们只需要调用SQLiteDatabase下的insert()函数即可, insert()函数需要传入三个参数,分别是:
- 第一个是表名,只需要将上文初始化时定义的dbName传入即可
- 第二个是
nullColumnHack
参数的值,它的作用是在ContentValues
为空的情况下确保插入操作可以执行。可以直接写null - 最后一个value就是ContentValues的对象,直接传入即可
综上所述,代码如下:
db.insert(tableName, null, cv);
但注意我们还需要关闭数据库,还要调用close()函数
db.close();
到此,我们的数据库增添函数写完了
查:
查询的话,至少我们要写个通过id查询的方法,可以的话个人建议写个queryAllData方法。
在此之前先介绍下Cursor:
Cursor:
Cursor
是一个接口,它提供了对数据库查询结果集进行随机访问的方法。当你执行一个查询操作时,数据库返回一个 Cursor
对象,它包含了查询结果。
使用 moveToFirst()
方法移动到结果集的第一行,moveToNext()
方法移动到下一行。如果移动成功,这些方法返回 true
,否则返回 false
可以使用 getString()
, getInt()
, getLong()
, getFloat()
, getBlob()
等方法来获取当前行特定列的值。
在使用完 Cursor
后,应该调用 close()
方法来释放资源。
queryById(int id):
public Data queryByid(int id){
}
因为我们是查不是改,因此我们直接调用ReadableDatabase()
SQLiteDatabase db = this.getReadableDatabase();
我们可以直接调用Cursor.query函数,下面是query函数在说明文档中的定义:
public Cursor query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy)
对于这些参数的意义如下:
-
table:必填参数,表示要查询的表的名称。
-
columns:可选参数,表示要返回的列的数组。如果传入
null
,则返回所有列。 -
selection:可选参数,表示 WHERE 子句的内容,用于指定查询条件。如果传入
null
,则不应用任何条件。 -
selectionArgs:可选参数,如果
selection
参数中包含占位符(如 “?”),则这个参数是一个字符串数组,用于替换占位符。数组中的值将按顺序替换selection
中的占位符。 -
groupBy:可选参数,表示 GROUP BY 子句的内容,用于指定分组条件。如果传入
null
,则不进行分组。 -
having:可选参数,表示 HAVING 子句的内容,用于指定分组后的过滤条件。如果传入
null
,则不应用任何过滤条件。 -
orderBy:可选参数,表示 ORDER BY 子句的内容,用于指定结果排序的列。如果传入
null
,则不进行排序。
由于我们只需要根据Id查询,所以只用第三,四项可选项目,但注意第四项目应当是String[],而不是String,int,double之类的类型。代码如下:
Cursor cursor = db.query(tableName, null,
" id = ? " ,
new String[] {Integer.toString(id) } ,
null, null, null );
这样以后cursor就包含我们需要的值了,我们只需要遍历cursor然后将各个值赋值给Data即可,我们将使用for( ; ; ) 来进行:
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
}
这样之后我们不需要while中嵌套个if,我没有diss之前的前辈开发,我只是在他们的基础上改进了,这样做不仅代码美观而且还易懂,后期维护方便
然后new个Data对象并进行.set的调用(注意是在for之前),所有代码如下:
public Data queryById(int id){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(tableName, null,
" id = ? " ,
new String[] {Integer.toString(id) } ,
null, null, null );
Data data = new Data();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
data.setData( cursor.getString(cursor.getColumnIndexOrThrow(colName1)) ,
cursor.getInt(cursor.getColumnIndexOrThrow(colName2))) ;
}
cursor.close();
db.close();
return data;
}
通过id查询数据库信息也更新完毕
queryAllData():
接下来就是查询所有Data信息:
介绍啥的参考上面queryById()介绍的,由于本次是查询所有值,因此我们甚至连查询条件都不需要了,那么我直接放上代码:
public ArrayList<Data> queryAll(){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(tableName, null, null, null, null, null, null);
ArrayList<Data> dataList = new ArrayList<>();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Data data = new Data();
data.setData( cursor.getString(cursor.getColumnIndexOrThrow(colName1)) ,
cursor.getInt(cursor.getColumnIndexOrThrow(colName2))) ;
dataList.add(data);
}
cursor.close();
db.close();
return dataList;
}
由于我们只能返回一个Object,因此可以把Data放进ArrayList当中,如果您想按照id来排列数据,可以在Orderby写"_id"或者直接调用之前的静态变量colID
删:
同样的,这里我们还是定义这俩函数:删除指定id和删除全部,这里我们还是可以直接
调用delete函数,对于delete()函数的定义:
public int delete(String table, String whereClause, String[] whereArgs)
table
: 需要删除数据的表名。whereClause
: 一个约束子句,用于指定删除哪些行。该子句的形式应该是一个SQL WHERE子句(不包含WHERE关键字)。如果这个参数为null
,则所有行都会被删除。whereArgs
: 用于替换whereClause
中的?
占位符的字符串数组。如果不需要替换任何占位符,这个参数可以是null
。
deleteAllData():
对于delete所以数据,即我们不需要任何条件全删即可,这里比较简单那么直接上代码:
public void deleteAll(){
SQLiteDatabase db = this.getWritableDatabase();
db.delete(tableName, null, null);
db.close();
}
deleteById(int id):
删除部分,与查询部分类似,这里还是不做多余的说明,若不懂请参考上文queryById(int id)部分:
public void deleteById(int id){
SQLiteDatabase db = this.getWritableDatabase();
db.delete(tableName, colID + "=?", new String[] {Integer.toString(id)});
db.close();
}
改:
改可能照一些旧教材来说改有点困难,实则不然,改也有对应的update()函数:
public int update(String table,
ContentValues values,
String whereClause, String[] whereArgs)
table
: 要更新记录的表名。values
: 一个ContentValues
对象,其中包含了要更新的列名和对应的新值。whereClause
: 一个约束子句,用于指定哪些记录应该被更新(类似于SQL中的WHERE
子句)。如果这个参数为null
,则所有的行都会被更新。whereArgs
: 你可以在whereClause
中使用?
作为占位符,whereArgs
是一个字符串数组,它提供用于替换whereClause
中占位符的实际值。
改分别为三个部分:
- 准备好WriteableDb和Cv,将数据准备好(把传入的data打包进contentValues)
- 调用update()函数
- 关闭WriteableDatabase
个人感觉,改是结合增和查的部分要素结合,所以我想的是如果读者增和查学好,应该能够看代码理解删和改,话不多说直接上代码:
public void updateDataById(Data newData, int id ){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(colName1, newData.getName());
cv.put(colName2, newData.getAge());
db.update(tableName, cv, colID + "=?", new String[] {Integer.toString(id)});
db.close();
}
到此,对于数据库的增删改查功能已完结