- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我偶尔会看到崩溃报告:
Fatal Exception: java.lang.IllegalStateException: Couldn't read row 1127, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetLong(CursorWindow.java)
at android.database.CursorWindow.getLong(CursorWindow.java:511)
at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:220)
at android.database.AbstractCursor.moveToNext(AbstractCursor.java:245)
at android.database.CursorWrapper.moveToNext(CursorWrapper.java:166)
at com.anthonymandra.util.ImageUtils.cleanDatabase(SourceFile:381)
显然 moveToNext
在循环中失败(注意第 1127 行)。该循环会删除代表无法再找到的文件的条目。
final ArrayList<ContentProviderOperation> operations = new ArrayList<>();
try( Cursor cursor = c.getContentResolver().query(Meta.CONTENT_URI, null, null, null, null))
{
if (cursor == null)
return;
final int uriColumn = cursor.getColumnIndex(Meta.URI);
final int idColumn = cursor.getColumnIndex(BaseColumns._ID);
while (cursor.moveToNext())
{
String uriString = cursor.getString(uriColumn);
if (uriString == null) // we've got some bogus data, just remove
{
operations.add(ContentProviderOperation.newDelete(
Uri.withAppendedPath(Meta.CONTENT_URI, cursor.getString(idColumn))).build());
continue;
}
Uri uri = Uri.parse(uriString);
UsefulDocumentFile file = UsefulDocumentFile.fromUri(c, uri);
if (!file.exists())
{
operations.add(ContentProviderOperation.newDelete(Meta.CONTENT_URI)
.withSelection(getWhere(), new String[]{uriString}).build());
}
}
}
c.getContentResolver().applyBatch(Meta.AUTHORITY, operations);
知道游标怎么会像那样在循环中失败吗?
最佳答案
您似乎在进行相当大的查询:至少 1127 行,以及所有可能的列(尽管您只使用了其中的两列)。而且,在你使用那个 Cursor
的过程中,您正在执行磁盘 I/O 和/或 IPC 返回到 ContentProvider
,假设 UsefulDocumentFile
与Android的DocumentFile
有关.
正如 Prakash 指出的那样,Cursor
您取回的信息可能仅包含一部分信息。一旦你尝试前进超过那个点,Cursor
需要返回到数据源并获取下一个结果窗口。如果在这项工作进行期间数据发生重大变化(例如,现在少于 1127 行),我可以预见您会遇到此类问题。
我建议你:
将您返回的列限制为您需要的子集,并且
避免循环期间的 I/O(例如,旋转 Cursor
以构建 ArrayList<Pair>
或其他东西,关闭 Cursor
,然后遍历列表)
关于java - Cursor.moveToNext 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40203198/
我正在尝试将表中的所有列查询到一个长 TextView 和/或字符串中。我知道这可能不是做事的正确方法,但我必须这样做。如果我错了,请纠正我,我的印象是下一步会得到行中的下一列: Cursor c =
//row --> 2 int row = mCursor.getCount(); for (int i = 0; i < row; i++) { if (mCursor.moveToPositio
为什么我的 Android Cursor 没有一直走到原来“promise”的末尾?? 我的 cursor.getCount() 与我上一个 cursor.getPosition() 不同。检查我的
我偶尔会看到崩溃报告: Fatal Exception: java.lang.IllegalStateException: Couldn't read row 1127, col 0 from Cur
在 Android 应用程序中,您可以使用方法 ContentResolver.query()查询 URI。结果,你得到一个 Cursor 对象,然后你只需执行 Cursor.moveToNext()
由于这个异常,我遇到了几次崩溃,但无法在我自己的任何设备/模拟器上复制它。 来自 google play console 的堆栈跟踪 android.database.CursorWindowAl
boolean android.database.Cursor.moveToNext() 文档说: http://developer.android.com/reference/android/dat
下一段代码会按预期工作吗? Cursor c = db.query(tableName, requestedColumns, condition, conditionParams, n
以下语句 cursor.moveToNext() 始终为 false。我希望循环执行一次。我测试过查询实际上返回了数据。 谁知道这是怎么回事? String query ="SELECT(SE
创建标准 SQLite 游标后,我将使用以下方法遍历条目: while (cursor.moveToNext()) { } 所有行都被正确处理。我读过的所有文档都表明您需要发出 moveToFirst
我整个早上都在 StackOverflow 上尝试自学如何在 Android 应用程序上对我上传的 SQLite 数据库进行查询。我尝试过原始查询和直接查询,但到目前为止都没有奏效。这是代码: pub
我正在我的 Sqlite 数据库中运行查询.. 我将结果保存在我的 Cursor 中,我正在遍历它以获得所有结果.. allotugh 我正在检查并看到游标有超过 1 行,它只给我第一行,因为 mov
我想知道是否可以在 moveToNext() 之前调用 getType() 和 getColumnNames()。 基本上,我正在尝试编写以下辅助函数: public static int getC
我是一名优秀的程序员,十分优秀!