问题描述
- 为什么网上很多文章说 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”。。。。
解决方案
Implementations should subclass AbstractCursor.
上面的一句很明显了,你看到的Cursor实例其实都是集成自AbstractCursor类的实例。
接口本身不能有自己的实例,但是实现类就可以了,这里的实例都是针对实现类即Implementations说的了。
楼主好细心啊。
解决方案二:
Cursor 是行的集合,这只是一种说法,为了大家好理解,而不是为了专业。它实际上是什么,你按 Android 官方的理解是对的。
接口,不能被直接实例化,这是接口的概念就已经确定的。Cursor 的具体定义呢,应该是已经定义了可实例化的类,如继承自 AbstractCursor 或其它。
最好是只找到 Cursor 的声明或定义看看,我无法打开 Android 的官网,所以没有看到。
解决方案三:
Cursor 是每行的集合。
使用 moveToFirst() 定位第一行。
你必须知道每一列的名称。
你必须知道每一列的数据类型。
Cursor 是一个随机的数据源。
所有的数据都是通过下标取得。
解决方案四:
我觉的说实在的,就是翻译过来没翻译好,有的书里直接翻译成游标,天然的汉语很少能正确的表达这个概念,还是你看英文文档怎么理解就好
解决方案五:
这些说法并不矛盾,只是各有侧重,可以这样把他们统一起来:
1、Cursor是访问数据的API
2、这个访问接口是用类来实现的
3、Cursor这个接口的实现类的数据是数据库的一个行的集合。
解决方案六:
父类引用可以指向子类实例;接口引用也可以指向实现了接口的类的实例。调用的方法则依据具体实例!
解决方案七:
和 Closeable 的声明有关系
解决方案八:
这个问题,我也迷茫,cursor 是个接口,那么通过databaseContentResolver 查询出来的数据集到底存放在哪里? 我通过追 ContentResolver.query() 方法,只能找到
CursorWrapperInner wrapper = new CursorWrapperInner(qCursorstableProvider != 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 的实现类 而具体的数据时如何的还是不明白