Java 如何使用内容提供者查询方法在android中连接两个表?

Java 如何使用内容提供者查询方法在android中连接两个表?,java,android,sqlite,kotlin,mobile-development,Java,Android,Sqlite,Kotlin,Mobile Development,我是android新手,我在我的应用程序中使用内容提供商,在我的应用程序中我想加入两个表,但我不知道如何做,请帮助我找到解决方案 我的桌子: CREATE TABLE Bank_customers (customer_id varchar PRIMARY KEY , customer_name varchar, customer_date_of_birth date, address varchar, mobile integer, email varch

我是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;**

如何使用content provider类查询方法实现上述查询内容提供程序是SQL之上的抽象,因此您无法直接访问表来连接它们

内容提供程序实现必须已提供联接表


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

内容提供者是SQL之上的抽象,因此您没有直接访问表的权限来连接它们

内容提供程序实现必须已提供联接表


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

这很容易做到。您需要将连接看作一个抽象表对不起,代码是用Java编写的

首先,创建一个新内容: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将抽象别名映射到列名上。

这很容易做到。您需要将连接看作一个抽象表对不起,代码是用Java编写的

首先,创建一个新内容: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将抽象别名映射到列名上。

我在应用程序中使用内容提供程序-为什么?仅当您与其他应用程序共享数据时才实现ContentProvider。我在应用程序中使用ContentProvider-为什么?只有在与其他应用程序共享数据时才实现ContentProvider。如果我想将来自android自己的ContentProvider(如联系人提供商)的数据与我创建的数据库连接起来,该怎么办?在这种情况下,我无法访问特定contentProvider的表名。当然,这是不可能的。正如您所说,您没有访问该表的权限。如果我想将来自android自己的内容提供商(如联系人提供商)的数据与我创建的数据库连接起来,该怎么办?在这种情况下,我无法访问特定contentProvider的表名。当然,这是不可能的。正如您所说,您没有访问该表的权限。