查询SQLite,Android中子字符串的多个变体的任何列

时间:2015-04-06 21:14:48

标签: android sqlite

我有一个数据表,其中有一列名为Threads.RECEPIENT_IDS。在该列中,我可以有如下行:4,10,25,60或2,4,8,20或只有4.如何查询包含4的所有行或查询行包含4的所有实例或者20.我想到了类似的东西:

String queryString = "'4','%,4','4,%','%,4,%','20','%,20','20,%','%,20,%'";

我无法弄清楚为什么这不会返回任何行。我的参数和cursorLoader在下面。

private final String[] threadsProjection = new String[] { Treads.RECIPIENT_IDS };
private final String threadsSelection = Threads.RECIPIENT_IDS + " like ?";
private final String threadsOrder = Threads.DATE + " DESC";

@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) {

    switch (loaderID) {
    case SMS_MMS_QUERY:
        String queryString = bundle.getString(BUNDLE_QUERY_KEY);
        CursorLoader queryCursorLoader = new CursorLoader(context, conversationsUri, threadsProjection, threadsSelection, new String[]{queryString}, threadsOrder);
        return queryCursorLoader;
    default:
        return null;
    }
}

1 个答案:

答案 0 :(得分:2)

这可以追溯到数据库设计,并且使用文本字段来保存ID列表的设计非常糟糕。这里更好的设计是一个单独的表来保存ID,例如 -

TABLE threads( *threadId, <info>, <info> )

TABLE thread_recipients( *threadId, *recipientId )

其中*标记主键。

然后,您将使用您的线程填充两个表,并且查询将是简单的,例如:

SELECT * 
  FROM threads 
 WHERE threadId IN ( SELECT threadId 
                       FROM thread_recipients
                      WHERE recipientId = ? )

没有可靠的方法来执行您尝试使用当前架构执行的操作。当您尝试查找recipientId&#34; 4&#34;时,即使LIKE查询也会失败。如果有&#34; 24&#34;或&#34; 34&#34;等