【问题标题】:how to join two tables in android using content provider query method?如何使用内容提供者查询方法在android中加入两个表?
【发布时间】:2018-02-23 10:59:02
【问题描述】:

我是 android 新手,我在我的应用程序中使用内容提供程序,在我的应用程序中我想加入两个表但我不知道该怎么做,请帮我找出解决方案

我的桌子:

CREATE TABLE Bank_customers (customer_id varchar PRIMARY KEY ,
    customer_name varchar,
    customer_date_of_birth date,
    address varchar,
    mobile integer,
    email varchar);

CREATE TABLE Bank_accounts (account_number integer(11) PRIMARY KEY,
    customer_id varchar ,
    account_type text,
    account_open_date date,
    account_balance real,FOREIGN KEY(customer_id) REFERENCES Bank_customers(customer_id));

my query: **SELECT mobile,Bank_accounts.customer_id from Bank_accounts,Bank_customers WHERE Bank_customers.customer_id = Bank_accounts.customer_id and Bank_accounts.account_number = 13323;**

如何使用内容提供者类“查询方法”实现上述查询

【问题讨论】:

  • “我在我的应用程序中使用内容提供程序”——为什么?仅当您与其他应用共享数据时,才实施 ContentProvider

标签: java android sqlite kotlin mobile-development


【解决方案1】:

内容提供程序是 SQL 之上的抽象,因此您无法直接访问表来加入它们。

内容提供者实现必须已经提供了连接表。

如果您不需要让其他应用程序可以访问数据,您可能应该避免使用内容提供程序,而是更直接地使用数据库。

【讨论】:

    【解决方案2】:

    这很容易做到。您需要将连接视为抽象表(对不起,代码是 Java ......)

    首先,创建一个新的content: URL 并使用URIMatcher 对其进行解析:

    private static final int JOIN_DIR_TYPE = 10;
    private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        // ...
        MATCHER.addURI(
            MyContract.AUTHORITY,
            MyContract.Join.TABLE,
            JOIN_DIR_TYPE);
    }
    

    现在,在您的查询方法中,将具有匹配 URL 的查询委托给单独的方法:

    @Override
    public Cursor query(Uri uri, String[] proj, String sel, String[] selArgs, String sort) {
        switch (MATCHER.match(uri)) {
            case JOIN_DIR_TYPE:
                return queryJoin(uri, proj, sel, selArgs, sort)
                break;
                // ...
            default:
                throw new IllegalArgumentException("Unexpected uri: " + uri);
        }
        // ...
    }
    

    现在,您所要做的就是在新方法中查询连接:

    private Cursor queryJoin(Uri uri, String[] proj, String sel, String[] selArgs, String sort) {
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
         qb.setTables("Bank_accounts LEFT OUTER JOIN Bank_customers ON (Bank_customers.customer_id = Bank_accounts.customer_id)")");
    

    您可能希望使用 QueryBuilder 的 ColumnMap 将抽象别名映射到列名。

    【讨论】:

    • 如果我想将来自 android 自己的 contentProvider(如联系人提供者)的数据与我创建的数据库连接怎么办?在这种情况下,我无权访问该特定 contentProvider 的表名。
    • 当然,这是不可能的。正如您所说,您无权访问该表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2015-02-02
    相关资源
    最近更新 更多