Cursor对象详解:

Cursor 位于 android.database.Cursor类,可见出它的设计是基于数据库服务产生的。

一开始接触Cursor的时候很是疑惑,而且感觉莫名其妙,感觉这个是一个比较抽象的东西,然后Android里边就更加的把他抽象成一个类,来供我们使用,Cursor的比喻很形象,只是刚开始没有将他与数据条目联系起来,只是想到的是当初的 物理学里边的游标卡尺,以及天秤上的游标。根据几天的接触,感觉更像是个迭代器对象,这个迭代器里存着很多数据,数据的形式是简单数据结构集:类似于

Struct{int a;int b;string s…}; 游标每移动一次就会指向当前的数据集,并可以从其中读取数据,比如Cursor中返回了一个数据集中第一个数据的位置,这个数据中包含了一个名字为 num的int型数据,那么就可以获取到num的值。

        1  Cursor 是每行的集合。

2  使用 moveToFirst() 定位第一行。

3  你必须知道每一列的名称。

4  你必须知道每一列的数据类型。

5  Cursor 是一个随机的数据源。

6  所有的数据都是通过下标取得。

当我们想从一个数据表中逐一读取一条数据的时候,一共分为以下几步:

打开数据中指定的表明,如果表不存在抛出异常

获取这个表的Cursor,获取之后通常是指向表的第一条数据,获取失败,抛出异常

判断获取的Cursor是不是为空,如果不为空那么就可以获取这条数据的具体信息,首先获得这条数据某一项数据的名字的列ID, int nameColumn = cur.getColumnIndex(People.NAME);

int phoneColumn = cur.getColumnIndex(People.NUMBER);

String name = cur.getString(nameColumn);

String phoneNumber = cur.getString(phoneColumn);

………

根据列ID取得这个ID下的值。(很奇怪,为什么不能根据名字直接定位到具体的数值呢?因为SQLite中的数据类型支持较少,一本为int或者字符串类,且在获取值的时候,需要判断具体的数值类型,但默认选出来的是text型数据。)

具体的子类如下图:

AbstractCursor

AbstractWindowedCursor

CrossProcessCursor

CursorWrapper

MatrixCursor

MergeCursor

MockCursor

SQLiteCursor

 

明白了其工作原理再来看函数的执行过程就容易的多了。

Contentvalues是一条数据,对应多个键值对,对应于数据库中一行数据。

每个Cursor对应的行中,所存的数据就是一个Contentvalues类型的数据。

posted on 2012-08-08 15:14  小白改bug  阅读(788)  评论(0)    收藏  举报

导航