加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用SQLiteDatabase操作SQLite数据库

发布时间:2020-12-13 00:04:42 所属栏目:百科 来源:网络整理
导读:Android 提供了一个名为 SQLiteDatabase 的类,该类封装了一些操作数据库的 API ,使用该类可以完成对数据进行添加 (Create) 、查询 (Retrieve) 、更新 (Update) 和删除 (Delete) 操作(这些操作简称为 CRUD )。对 SQLiteDatabase 的学习,我 们应该重点掌
Android 提供了一个名为 SQLiteDatabase 的类,该类封装了一些操作数据库的 API ,使用该类可以完成对数据进行添加 (Create) 、查询 (Retrieve) 、更新 (Update) 和删除 (Delete) 操作(这些操作简称为 CRUD )。对 SQLiteDatabase 的学习,我 们应该重点掌握 execSQL() rawQuery() 方法。 execSQL() 方法可以执行 insert delete update CREATE TABLE 之类有 更改行为的 SQL 语句; rawQuery() 方法可以执行 select 语句。 execSQL() 方法的使用例子: SQLiteDatabase db = ....; db.execSQL("insert into person(name,age) values(' 传智播客 ',4)"); db.close(); 执行上面 SQL 语句会往 person 表中添加进一条记录,在实际应用中, 语句中的 传智播客 这些参数值会由用户输入界面提 供,如果把用户输入的内容原样组拼到上面的 insert 语句, 当用户输入的内容含有单引号时,组拼出来的 SQL 语句就会存 在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像 & 这些特殊 SQL 符号,为保证组拼好的 SQL 语句语法正确,必须对 SQL 语句中的这些特殊 SQL 符号都进行转义,显然, 对每条 SQL 语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase 类提供了一个重载后的 execSQL(String sql,Object[] bindArgs) 方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数 (?) 。使用例子如下: ",4}); db.close(); execSQL(String sql,Object[] bindArgs) 方法的第一个参数为 SQL 语句,第二个参数为 SQL 语句中占位符参数的值,参数值 在数组中的顺序要和占位符的位置对应。 SQLiteDatabase rawQuery() 用于执行 select 语句,使用例子如下:
SQLiteDatabase db = ....; Cursor cursor = db.rawQuery(“select * from person”,null); while (cursor.moveToNext()) { int personid = cursor.getInt(0); // 获取第一列的值 , 第一列的索引从 0 开始 String name = cursor.getString(1); 获取第二列的值 int age = cursor.getInt(2); 获取第三列的值 } cursor.close(); db.close(); rawQuery() 方法的第一个参数为 select 语句;第二个参数为 select 语句中占位符参数的值,如果 select 语句没有使用占位 符,该参数可以设置为 null 。带占位符参数的 select 语句使用例子如下: Cursor cursor = db.rawQuery("select * from person where name like ? and age=?",new String[]{"% 传智 %","4"}); Cursor 是结果集游标,用于对结果集进行随机访问,如果大家熟悉 jdbc 其实 Cursor JDBC 中的 ResultSet 作用很相似。 使用 moveToNext() 方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为 false ,否则为 true 。另外 Cursor 还有常用的 moveToPrevious() 方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一 行,返回值为 false ,否则为 true )、 moveToFirst() 方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为 false ,否则为 true )和 moveToLast() 方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为 false ,否则 true 除了前面给大家介绍的 execSQL() rawQuery() 方法, SQLiteDatabase 还专门提供了对应于添加 删除 更新 查询的操 作方法: insert() delete() update() query() 。这些方法实际上是给那些不太了解 SQL 语法的菜鸟使用的,对于熟悉 SQL 语法的程序员而言,直接使用 execSQL() rawQuery() 方法执行 SQL 语句就能完成数据的添加 删除 更新 查询操 作。 Insert() 方法用于添加数据 ,各个字段的数据使用 ContentValues 进行存放。 ContentValues 类似于 MAP ,相对于 MAP 提供了存取数据对应的 put(String key,Xxx value) getAsXxx(String key) 方法, key 为字段名称, value 为字段值, Xxx 的是各种常用的数据类型,如: String Integer 等。 SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name"," 传智播客 "); values.put("age",4); long rowid = db.insert(“person”,null,values); // 返回新添记录的行号,与主键 id 无关 不管第三个参数是否包含数据,执行 Insert() 方法必然会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他 字段值为 Null 的记录。 Insert() 方法内部实际上通过构造 insert 语句完成数据的添加, Insert() 方法的第二个参数用于指定空值 字段的名称,相信大家对此参数会感到疑惑,此参数的作用是干嘛的?是这样的:如果第三个参数 values Null 或者元素 个数为 0 Insert() 方法必然要添加一条除了主键之外其它字段为 Null 值的记录,为了满足这条 insert 语句的语法, insert 句必须给定一个字段名,如: insert into person( name ) values( NULL ) ,倘若不给定字段名 insert 语句就成了这样: insert into person() values() ,显然这不满足标准 SQL 的语法。对于字段名,建议使用主键之外的字段,如果使用了 INTEGER 类型的主键字段,执行类似 insert into person(personid) values(NULL) insert 语句后,该主键字段值也不会为 NULL 。如果第三个参数 values 不为 Null 并且元素的个数大于 0 ,可以把第二个参数设置为 null delete() 方法的使用: SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.delete("person","personid<?",new String[]{"2"}); db.close(); 上面代码用于从 person 表中删除 personid 小于 2 的记录。 update() 方法的使用: ContentValues values = new ContentValues(); values.put(“name”,“ 传智播客 ”); //key 为字段名, value 为值 db.update("person",values,"personid=?",new String[]{"1"}); db.close(); 上面代码用于把 person 表中 personid 等于 1 的记录的 name 字段的值改为 传智播客 query() 方法实际上是把 select 语句拆分成了若干个组成部分,然后作为方法的输入参数: SQLiteDatabase db = databaseHelper.getWritableDatabase(); Cursor cursor = db.query("person",new String[]{"personid,name,age"},"name like ?",new String[]{"% 传智 %"},"personid desc", "1,2"); while (cursor.moveToNext()) { int personid = cursor.getInt(0); // 获取第一列的值 第一列的索引从 0 开始 String name = cursor.getString(1); 获取第二列的值 int age = cursor.getInt(2); 获取第三列的值 } cursor.close(); db.close(); 上面代码用于从 person 表中查找 name 字段含有 传智 的记录,匹配的记录按 personid 降序排序,对排序后的结果略过第一条记录,只获取 2 条记 录。 query(table,columns,selection,selectionArgs,groupBy,having,orderBy,limit) 方法各参数的含义: table :表名。相当于 select 语句 from 关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。 columns :要查询出来的列名。相当于 select 语句 select 关键字后面的部分。 selection :查询条件子句,相当于 select 语句 where 关键字后面的部分,在条件子句允许使用占位符 ? selectionArgs :对应于 selection 语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。 groupBy :相当于 select 语句 group by 关键字后面的部分 having :相当于 select 语句 having 关键字后面的部分 orderBy :相当于 select 语句 order by 关键字后面的部分,如: personid desc,age asc; limit :指定偏移量和获取的记录数,相当于 select 语句 limit 关键字后面的部分。 使用 SQLiteDatabase beginTransaction() 方法可以开启一个事务,程序执行到 endTransaction() 方法时会检查事务的标志 是否为成功,如果程序执行到 endTransaction() 之前调用了 setTransactionSuccessful() 方法设置事务的标志为成功则提交 事务,如果没有调用 setTransactionSuccessful() 方法则回滚事务。使用例子如下:
SQLiteDatabase db = ....; db.beginTransaction();/ / 开始事务 try { db.execSQL("insert into person(name,new Object[]{" 传智播客 ",4}); db.execSQL("update person set name=? where personid=?",new Object[]{" 传智 ",1}); db.setTransactionSuccessful();// 调用此方法会在执行到 endTransaction() 时提交当前事务,如果不调用此方法会回滚事务 } finally { db.endTransaction();/ 由事务的标志决定是提交事务,还是回滚事务 } db.close(); 上面两条 SQL 语句在同一个事务中执行。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读