在selectionArgs中为单个db列创建一个包含多个项目的游标

时间:2015-05-13 14:53:29

标签: android

我试图创建一个游标加载器,我想在两个项目的特定列中查询,类似于:

SELECT * FROM TABLE_NAME WHERE COLUMN_NAME IN(something, something_else);

return new CursorLoader(getActivity(),
                myUri,
                null,
                MyContract.FoodEntry.COLUMN_TYPE + " = ? ",
                selectionArgs,
                null);

不确定selectionArgs(这是一个String数组)应该是什么样子。有没有办法实现我想要的实现?

1 个答案:

答案 0 :(得分:1)

您需要使用LIKE关键字并使用%somethingsomething_else的任意一侧指定通配符。

此外,您应该使用实例变量来存储两个字符串,因为我不确定如何将它们传递到onCreateLoader()

我刚刚通过查询设备上的联系人对此进行了测试,它会让您了解如何使用selectionArgs

请注意,对于?参数中的每个selection,您需要selectionArgs

中的相应字符串
@Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        Uri CONTENT_URI = ContactsContract.RawContacts.CONTENT_URI;
        String s1 = "Dan";
        String s2 = "nugent";
        String[] selectionArgs = {"%" + s1 + "%" , "%"  + s2 + "%" };
        return new CursorLoader(this, CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY + " LIKE ? OR " + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY + " LIKE ?", selectionArgs, null);
    }

请参阅Documentation Here

因此,对于您的具体示例,它将是这样的:

    String[] selectionArgs =  {"%" + something + "%" , "%"  + something_else + "%" };
    return new CursorLoader(getActivity(),
            myUri,
            null,
            MyContract.FoodEntry.COLUMN_TYPE + " LIKE ? OR " +  MyContract.FoodEntry.COLUMN_TYPE + " LIKE ?",
            selectionArgs,
            null);

另外,如果这有帮助,这就是我在测试中检索值的方法:

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
    if (cursor.moveToFirst()) {
        StringBuilder res = new StringBuilder();
        while (!cursor.isAfterLast()) {
            res.append("\n" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY)));

            cursor.moveToNext();
        }
        textView.setText(res);
    }

}

我还让Activity实现了LoaderManager.LoaderCallbacks接口:

public class MainActivity extends ActionBarActivity  implements
        LoaderManager.LoaderCallbacks<Cursor>{