尝试使用where子句

时间:2017-11-12 16:02:27

标签: android mysql sqlite android-contentprovider

可能是一个非常简单的解决方案的完整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 + " = ?",则应用会在运行时崩溃。

如果我按预期更改selectionselectionArgsnull,我会收到所有退回的项目。

关于我能做些什么来解决这个问题的任何建议都会受到很大的欢迎,因为现在我要疯狂了!

1 个答案:

答案 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 的值。

当然,这不会解决返回空游标的根本问题。