我们在安卓开发数据持久化存储中的SQLite数据库存储或者是内容提供器访问应用程序的数据的时候免不了使用
Cursor来读取表中的数据
Cursor是什么?
SQL的游标是一种临时的数据库对象,即可以用来存放在数据表中的数据行副本,也可以指向
存储在数据库中的数据行的指针,游标的一个常见的用途就是保存查询结果,以便以后使用。
关于SQLiteDatabase帮助类对数据库的升级创建和LitePal开源框架(郭霖教父)的内容我就不写了,大家可看看第一行代码中
Android Studio开发工具书,讲的很清楚。我就只写内容提供器中Cursor是如何遍历的数据的。
对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,就一定要借助ContentResolver类,可以通过
Context中的getContentResolver()方法获取到该类的实例。其提供了一系列的方法对数据进行CRUD操作(Create添加,Retrieve查询,upgrade更新,delete删除)。和SQLiteDatabase不同,ContentResolver中的增删查改方法都是不接收表名参数的,而是使用一个Uri参数代替,这个参数被称为内容Uri.内容Uri给内容提供其中的数据建立了唯一标识符,其主要由两部分组成
authority和path.authority是对不同的应用程序做区分的,一般采用程序的包名,path则是用于对同一应用程序中的不同的表做区分的,通常都会添加到authority后面。
eg: content://com.example.app.provider/table1 内容Uri可以非常清楚的表达出我们想要访问哪个程序中的哪张表里的数据。
Uri uri = Uri.parse("content://com.example.app.provider.table1")将内容Uri字符串解析成Uri对象
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder) query()方法返回一个游标对象 里面具体的参数大家CSDN看看别人的博客,我这里主要想做一下cursor遍历的笔记
从Cursor对象中取出数据的两种方法:
查询完成后返回的是一个Cursor对象,我们就可以将数据从这个Cursor对象中逐个取出来了。读取的思路是通过移动游标的位置
遍历Cursor的所有行,然后再取出每一行中相应列的数据。
//遍历方法1: if (cursor.moveToFirst()) { do{ //取出数据,调用cursor.getInt/getString等方法 }while(cusor.moveToNext()); } //遍历方法2: if(cusor != null){ while(cursor.moveToNext()) { //读取数据 } }
注意:查询得到的Cursor是指向第一条记录之前的,因此查询得到的cursor后第一次调用moveToFirst或moveToNext都
可以将cursor移动到第一条记录上