我有一个数据表,它有一列名为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,%'";
我只是不明白为什么这不返回任何行。下面是我的参数和游标加载器。
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;
}
}
这要回到数据库设计,使用文本字段来保存ID列表是非常糟糕的设计。这里更好的设计是使用一个单独的表来保存ID,例如--
TABLE threads( *threadId, <info>, <info> )
和
TABLE thread_recipients( *threadId, *recipientId )
其中CCD_ 3标记主键。
然后,您将用线程填充这两个表,查询将是简单的,例如:
SELECT *
FROM threads
WHERE threadId IN ( SELECT threadId
FROM thread_recipients
WHERE recipientId = ? )
没有可靠的方法来做您试图用当前模式做的事情。如果有"24"或"34"等,当您试图查找receiventId"4"时,即使是LIKE
查询也会失败。