可能是一个非常简单的解决方案的完整n00b问题,但我的应用程序上有一个SQLite数据库,我通过内容提供商访问。
在其中一个活动中,我试图查询其中一个表(picturesTable),其中包含图像路径和(itemTable)的外键。
我希望查询过滤itemTable _id字段返回的图片(这是图片表中保存的外键。
虽然测试我只是在TextView中显示返回的路径。字符串ItemId
作为intentExtra从前一个活动传递。
Uri imgUri = mProvider.CONTENT_URI;
String[] columns = mDbHelper.ALL_IMG_COLUMNS;
String selection = mDbHelper.IMG_ITEM_ID;
String[] selectionArgs = new String[]{ItemId};
String groupBy = null;
Cursor imgCursor = getContentResolver().query(imgUri, columns,
selection , selectionArgs, groupBy);
String imgPath = "";
assert imgCursor != null;
imgCursor.moveToFirst();
do {
imgPath += imgCursor.getString(
imgCursor.getColumnIndex(mDbHelper.IMG_PATH)) + "\n";
imgPath += "Image ID " + imgCursor.getString(
imgCursor.getColumnIndex(mDbHelper.IMG_TREE_ID)) + "\n" + "\n";
} while (imgCursor.moveToNext());
imgCursor.close();
tv.setText(imgPath);
我遇到的问题是,目前它只是返回了图片表中的最后一项。
如果我将selection
更改为mDbHelper.IMG_ITEM_ID + " = ?"
,则应用会在运行时崩溃。
如果我按预期更改selection
和selectionArgs
至null
,我会收到所有退回的项目。
关于我能做些什么来解决这个问题的任何建议都会受到很大的欢迎,因为现在我要疯狂了!
答案 0 :(得分:1)
您的问题可能是由于没有数据与WHERE子句匹配而返回空游标。
空游标明显不同于空Cursor,它永远不会被查询返回。因此assert
对空的或填充的游标没有影响(假设这是断言的意图)。
如果没有第一行要移动,Cursor的moveToFirst
方法将返回false,如空Cursor的情况。但是,由于未进行检查,因此对于已填充的Cursor,处理/处理空Cursor没有任何不同。
如果你有do... while
,如果存在空光标而不是填充光标,那么imgPath += imgCursor.getString( imgCursor.getColumnIndex(mDbHelper.IMG_PATH)) + "\n";
将导致异常,因为没有可以从中检索数据的有效行。 / p>
如同moveToNext
一样moveToFirst
,如果无法移动则返回false,那么我建议最简单的解决方案来处理无数据,至少对于这部分代码将取代: -
assert imgCursor != null;
imgCursor.moveToFirst();
do {
imgPath += imgCursor.getString(
imgCursor.getColumnIndex(mDbHelper.IMG_PATH)) + "\n";
imgPath += "Image ID " + imgCursor.getString(
imgCursor.getColumnIndex(mDbHelper.IMG_TREE_ID)) + "\n" + "\n";
} while (imgCursor.moveToNext());
: -
while (imgCursor.moveToNext) {
imgPath += imgCursor.getString(
imgCursor.getColumnIndex(mDbHelper.IMG_PATH)) + "\n";
imgPath += "Image ID " + imgCursor.getString(
imgCursor.getColumnIndex(mDbHelper.IMG_TREE_ID)) + "\n" + "\n";
}
然后,这将不会尝试为空Cursor分配 imgPath 的值。
当然,这不会解决返回空游标的根本问题。