2017-09-14 67 views
0

进出口新到Android我使用的是内容提供商在我的应用程序,在我的应用我要加入两个表,但我不知道该怎么办,请帮我找出解决办法如何在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;** 

我如何使用内容提供商类“查询方法”

+0

“我在我的应用程序中使用内容提供程序” - 为什么?如果您正在与另一个应用程序共享数据,则只需实施“ContentProvider”。 – CommonsWare

回答

1

这很容易做到。你需要考虑的加入作为一个抽象的表(对不起,代码是在Java中...)

首先,创建一个新的URL content:并使用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抽象别名映射到列名。

+1

非常感谢,现在工作了 –

2

内容提供商都在SQL之上的抽象,所以你不必直接访问表加入他们实现上面的查询。

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

如果没有需要为其他应用程序中的数据访问,你或许应该避免使用内容提供商,以及更直接地使用数据库。

+0

谢谢,找到解决方案 –

相关问题