我经常看到这样的代码:迭代数据库查询的结果,对每一行执行一些操作,然后转到下一行.典型的例子如下.

Cursor cursor = db.rawQuery(...);
cursor.moveToFirst();
while (cursor.isAfterLast() == false) 
{
    ...
    cursor.moveToNext();
}
Cursor cursor = db.rawQuery(...);
for (boolean hasItem = cursor.moveToFirst(); 
     hasItem; 
     hasItem = cursor.moveToNext()) {
    ...
}
Cursor cursor = db.rawQuery(...);
if (cursor.moveToFirst()) {
    do {
        ...                 
    } while (cursor.moveToNext());
}

在我看来,这些方法似乎都太冗长了,每个方法都对Cursor个方法进行了多次调用.肯定有更整洁的方法吗?

推荐答案

最简单的方法是:

while (cursor.moveToNext()) {
    ...
}

游标开始before第一个结果行,因此在第一次迭代时,它移动到第一个结果if it exists.如果游标为空,或者最后一行已被处理,则循环整齐退出.

当然,使用完游标后不要忘记关闭它,最好是在finally子句中.

Cursor cursor = db.rawQuery(...);
try {
    while (cursor.moveToNext()) {
        ...
    }
} finally {
    cursor.close();
}

如果您的目标是API19+,您可以使用try-with-resource.

try (Cursor cursor = db.rawQuery(...)) {
    while (cursor.moveToNext()) {
        ...
    }
}

Android相关问答推荐

在编写中强制软键盘呈现

编写Inbox需要具有匹配兼容性的Kotlin版本

了解数据加载在Kotlin中的工作原理

当我在Android上运行应用程序时,组件会随机调整大小和移动

即使安装了Chrome和YouTube,Android对action_view a YouTube URL的意图也是空的

添加可组合元素的列表?

从未设置实时数据值

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

如何在Jetpack Compose中更新异步回调的用户界面

如何在Jetpack Compose中实现前后动画?

页面更改时不显示 cogo toast 消息

没有打开历史记录的活动意向 Select 器完成调用活动

当 Firebase Firestore 发生变化时,Kotlin ViewModel 不会更新

从 Jetpack Compose 中的 IconButton 中删除黑色色调

Jetpack Compose Material3 禁用 ListItem

Android Compose:LazyColumn 和 Column with verticalScroll 的区别

Jetpack Compose:mutableStateOf 不随流量更新

Jetpack 组合和片段

Android Material Date Range Picker - 如何仅更改所选范围日期的文本 colored颜色 ?

基线配置文件 x R8/Proguard