2017-09-14 3 views
0

Im nouveau android J'utilise fournisseur de contenu dans ma demande, Dans ma demande, je veux joindre deux tables mais je ne sais pas comment le faire, s'il vous plaît me aider à trouver la solutioncomment joindre deux tables dans android en utilisant la méthode de requête de fournisseur de contenu?

mes tables:

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

Comment puis-je mettre en œuvre ci-dessus requête en utilisant « la méthode de requête » de classe fournisseur de contenu

+0

"J'utilise le fournisseur de contenu dans mon application" - pourquoi? N'implémentez un 'ContentProvider' que si vous partagez des données avec une autre application. – CommonsWare

Répondre

1

C'est facile à faire. Vous devez penser à la jointure comme une table abstraite (désolé, le code est en Java ...)

Tout d'abord, créez une nouvelle URL content: et utiliser un URIMatcher pour l'analyser:

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); 
} 

Maintenant, dans votre méthode de requête, déléguer des requêtes avec l'URL correspondant à une méthode distincte:

@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); 
    } 
    // ... 
} 

maintenant, tout ce que vous avez à faire est la jointure de requête, dans la nouvelle méthode:

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)")"); 

Vous pouvez utiliser le ColumnMap de QueryBuilder pour mapper des alias abstraits sur des noms de colonnes.

+1

Merci beaucoup, son fonctionnement maintenant –

2

les fournisseurs de contenu sont une abstraction au-dessus de SQL, de sorte que vous ne disposez pas d'un accès direct aux tables pour les rejoindre.

L'implémentation du fournisseur de contenu doit déjà fournir les tables jointes.

Si vous n'avez pas besoin de rendre les données accessibles pour d'autres applications, évitez probablement d'utiliser un fournisseur de contenu et utilisez la base de données plus directement.

+0

merci, trouvé la solution –