【问题标题】:Android contentprovider complex query involving 2 tables涉及2个表的Android contentprovider复杂查询
【发布时间】:2014-05-29 11:24:12
【问题描述】:

如何在 contentprovider 中运行此查询?

SELECT * FROM sms_data WHERE number != (SELECT DISTINCT number from test) AND time > ? 

【问题讨论】:

  • 我认为<> 用于not equal to

标签: android android-sqlite android-contentprovider


【解决方案1】:

首先,查询可能是错误的。你可能想要number NOT IN (...),而不是number != (...)

假设test 是您的应用程序中的表,而不是内容提供程序中的表,您可以分两步执行查询:

  1. 子查询SELECT DISTINCT number FROM test。从结果中构建一个逗号分隔的字符串,例如 '12345','23456','45678'

  2. 使用选择执行内容提供者查询

    number NOT IN (<that comma-separated list>) AND time > ?
    

【讨论】:

【解决方案2】:

对于子查询,您可以使用 rawQuery() 或 SQLiteQueryBuilder

【讨论】:

    【解决方案3】:

    重写 ContentProvider 的 onQuery 方法,我设法把这一堆对我很有效的代码。

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        switch (URI_MATCHER.match(uri)) {
            case TABLE1:
                Cursor cursor = database.query("sms_data", projection, selection, selectionArgs, null, null, sortOrder);
                cursor.setNotificationUri(getContext().getContentResolver(), uri);
                return cursor;
            case TABLE2:
                Cursor c = database.query(true, "test", projection, selection, selectionArgs, null, null, sortOrder, null);
                c.setNotificationUri(getContext().getContentResolver(), uri);
                return c;
            case COMBINED:
                String sql = "SELECT " + appendColumns(projection) +
                        " FROM sms_data WHERE number != IFNULL((SELECT DISTINCT number FROM test), 'abc') AND "  +  selection;
                Cursor cur = database.rawQuery(sql, selectionArgs);
                cur.setNotificationUri(getContext().getContentResolver(), uri);
                return cur;
            default:
                throw new IllegalArgumentException("Unsupported URI: " + uri + " Match = " + URI_MATCHER.match(uri));
        }
    }  
    

    希望这对你也有用。

    【讨论】:

    • 请记住,这只适用于测试表中的单行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多