为什么网上很多文章说 Cursor是一行的集合?明明是一个接口

http://www.2cto.com/kf/201109/103163.html
抄来抄去,转来转去,基本就上面链接里这个文章,说Cursor是每行的集合。
android 官方api是这么描述Cursor的:“This interface provides。。。。”这是一个接口啊,所以是我理解太肤浅还是网上的文章描述不够专业?

另外在进行数据库操作时,会有类似下面的语句:

Cursor cursor = db.query(.....)

此处db是SQLiteDatabase的一个实例,调用query方法返回一个cursor实例,但是。。。Cursor不是接口吗?接口怎么有实例了?
于是我又迷茫了。。。求指点

还有一个问题,既然是接口,我通过android studio查看Cusor时,它的方法怎么都没有加“abstract”。。。。
图片说明

8个回答

Implementations should subclass AbstractCursor.
上面的一句很明显了,你看到的Cursor实例其实都是集成自AbstractCursor类的实例。
接口本身不能有自己的实例,但是实现类就可以了,这里的实例都是针对实现类即Implementations说的了。
楼主好细心啊。

tongyi55555
JonsonJiao 回复samuwoo: 深有同感。希望CSDN能有效解决这个问题。
5 年多之前 回复
samuwoo
samuwoo 回复samuwoo: 在评论这里多说句(不是说您哈。。我是没地方写了),在csdn提问也不少了,不少所谓的热心人,其实看不起我这种菜鸟,但是它们说出来的答案,有时候还真离谱,麻烦你们别那么拽了
5 年多之前 回复
samuwoo
samuwoo 我最后去stackvoverflow提问,5分钟解决。就您喝shiter的答案比较靠谱,其他人,根本没理解我在问什么。
5 年多之前 回复

Cursor 是行的集合,这只是一种说法,为了大家好理解,而不是为了专业。它实际上是什么,你按 Android 官方的理解是对的。

接口,不能被直接实例化,这是接口的概念就已经确定的。Cursor 的具体定义呢,应该是已经定义了可实例化的类,如继承自 AbstractCursor 或其它。
最好是只找到 Cursor 的声明或定义看看,我无法打开 Android 的官网,所以没有看到。

91program
91program 回复91program: 这说明 Cursor 是一个类。
5 年多之前 回复
91program
91program 回复samuwoo: 我还找到以下说明呢:Cursor is the class which represents a 2 dimensional table of any database. When you try to retrieve some data using SELECT statement, then the database will first create a CURSOR object and return its reference to you.
5 年多之前 回复
91program
91program 回复samuwoo: 我不想看什么文档, Android 不是号称全开源的吗?查它的声明或定义的源代码,这才是能说明一些的根源。
5 年多之前 回复
samuwoo
samuwoo This interface provides random read-write access to the result set returned by a database query. Cursor implementations are not required to be synchronized so code using a Cursor from multiple threads should perform its own synchronization when using the Cursor. Implementations should subclass AbstractCursor.
5 年多之前 回复
samuwoo
samuwoo 官方文档是这样描述的:
5 年多之前 回复

我觉的说实在的,就是翻译过来没翻译好,有的书里直接翻译成游标,天然的汉语很少能正确的表达这个概念,还是你看英文文档怎么理解就好

这些说法并不矛盾,只是各有侧重,可以这样把他们统一起来:
1、Cursor是访问数据的API
2、这个访问接口是用类来实现的
3、Cursor这个接口的实现类的数据是数据库的一个行的集合。

父类引用可以指向子类实例;接口引用也可以指向实现了接口的类的实例。调用的方法则依据具体实例!

和 Closeable 的声明有关系

这个问题,我也迷茫,cursor 是个接口,那么通过database,ContentResolver 查询出来的数据集到底存放在哪里? 我通过追 ContentResolver.query() 方法,只能找到
CursorWrapperInner wrapper = new CursorWrapperInner(qCursor,stableProvider != null ? stableProvider : acquireProvider(uri));
stableProvider = null;
qCursor = null;
return wrapper;
而ContentResolver.query() 的返回类型是cursor 而CursorWrapperInner 是cursor 的实现类。
private final class CursorWrapperInner extends CrossProcessCursorWrapper {....}

public class CrossProcessCursorWrapper extends CursorWrapper implements CrossProcessCursor {...}

public class CursorWrapper implements Cursor {...} 这里可以追到 CursorWrapperInner 是cursor 的实现类 而具体的数据时如何的还是不明白

Cursor 是每行的集合。
使用 moveToFirst() 定位第一行。
你必须知道每一列的名称。
你必须知道每一列的数据类型。
Cursor 是一个随机的数据源。
所有的数据都是通过下标取得。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐