android - SQLite、Android 中一个子字符串的多个变体中的任何一个的查询列

标签 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;
    }
}

最佳答案

这可以追溯到数据库设计,使用文本字段来保存 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 = ? )

没有可靠的方法来执行您尝试对当前模式执行的操作。即使是 LIKE如果有“24”或“34”等,当您尝试查找 recipientId“4”时,查询将失败。

关于android - SQLite、Android 中一个子字符串的多个变体中的任何一个的查询列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29479816/

相关文章:

android - 在 React Native 中从 php url 获取数据并保存到本地 sqlite

php - 无法在 SQLite 表中插入字符串,但可以插入数字

Android上下文子菜单自行打开-关闭-重新打开

android - FFmpeg 创建空调色板,以获得更好的 GIF 转换质量

java - 如何使用 SQLite 直接访问文件中的特定记录?在 LibGDX 中

sql - 使用纯 SQLite 将字符串转换为二进制并返回

Android Studio Gradle 加载

android - 是什么造就了 Android GUI 框架

android - 在聊天应用程序中使用什么通知系统?

ruby-on-rails - rails : stack level too deep