如何使用内容提供程序查询方法连接 android 中的两个表?
how to join two tables in android using content provider query method?
我是 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;**
如何使用内容提供程序实现上述查询 class "query method"
内容提供者是 SQL 之上的抽象,因此您无法直接访问表以加入它们。
内容提供商实现必须已经提供了连接表。
如果您不需要让其他应用程序访问数据,您应该避免使用内容提供程序,而更直接地使用数据库。
这很容易做到。您需要将连接视为抽象 table(抱歉,代码在 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 的新手,我在我的应用程序中使用内容提供程序,在我的应用程序中,我想加入两个表,但我不知道该怎么做,请帮我找出解决方案
我的表:
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;**
如何使用内容提供程序实现上述查询 class "query method"
内容提供者是 SQL 之上的抽象,因此您无法直接访问表以加入它们。
内容提供商实现必须已经提供了连接表。
如果您不需要让其他应用程序访问数据,您应该避免使用内容提供程序,而更直接地使用数据库。
这很容易做到。您需要将连接视为抽象 table(抱歉,代码在 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
将抽象别名映射到列名。