Java安卓开发之SQLiteDatabase中(通俗易懂版)——第7章

继上一篇我们将初始化工作做好之后,正式开始对于数据库增删改查一系列的函数定义

在开始之前,我们下文会提到一个类: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()函数需要传入三个参数,分别是:

  1. 第一个是表名,只需要将上文初始化时定义的dbName传入即可
  2. 第二个是nullColumnHack 参数的值,它的作用是在 ContentValues 为空的情况下确保插入操作可以执行。可以直接写null
  3. 最后一个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)

                对于这些参数的意义如下:

  1. table:必填参数,表示要查询的表的名称。

  2. columns:可选参数,表示要返回的列的数组。如果传入 null,则返回所有列。

  3. selection:可选参数,表示 WHERE 子句的内容,用于指定查询条件。如果传入 null,则不应用任何条件。

  4. selectionArgs:可选参数,如果 selection 参数中包含占位符(如 “?”),则这个参数是一个字符串数组,用于替换占位符。数组中的值将按顺序替换 selection 中的占位符。

  5. groupBy:可选参数,表示 GROUP BY 子句的内容,用于指定分组条件。如果传入 null,则不进行分组。

  6. having:可选参数,表示 HAVING 子句的内容,用于指定分组后的过滤条件。如果传入 null,则不应用任何过滤条件。

  7. 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)
  1. table: 需要删除数据的表名。
  2. whereClause: 一个约束子句,用于指定删除哪些行。该子句的形式应该是一个SQL WHERE子句(不包含WHERE关键字)。如果这个参数为null,则所有行都会被删除。
  3. 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)
  1. table: 要更新记录的表名。
  2. values: 一个ContentValues对象,其中包含了要更新的列名和对应的新值。
  3. whereClause: 一个约束子句,用于指定哪些记录应该被更新(类似于SQL中的WHERE子句)。如果这个参数为null,则所有的行都会被更新。
  4. whereArgs: 你可以在whereClause中使用?作为占位符,whereArgs是一个字符串数组,它提供用于替换whereClause中占位符的实际值。

 改分别为三个部分:

  1. 准备好WriteableDb和Cv,将数据准备好(把传入的data打包进contentValues)
  2. 调用update()函数
  3. 关闭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();
    }

到此,对于数据库的增删改查功能已完结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Автомата Калашникова

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值