2010-09-27 6 views
2

J'essaie de réduire le nombre de requêtes que je fais à la base de données d'Android. Fondamentalement, je veux obtenir un courriel ou une adresse de messagerie instantanée qui contient un terme de recherche défini par l'utilisateur. En ce moment, je fais deux requêtes distinctes:Pouvez-vous interroger deux tables dans une déclaration dans Android?

Email:

Cursor emails = cr.query( 
    ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
    null, 
    ContactsContract.CommonDataKinds.Email.DATA + " LIKE ?", 
    new String[] {searchTerm}, 
    null); 

IM:

Cursor cursor = cr.query(
    ContactsContract.Data.CONTENT_URI, 
    null, 
    ContactsContract.CommonDataKinds.Im.DATA + " LIKE ?", 
    new String[] {searchTerm}, 
    null); 

Quelqu'un connaît un moyen facile de combiner les deux requêtes? Le nœud du problème semble être que les deux URI de contenu sont différents.

Simon

Répondre

0

J'ai découvert que si vous faites une requête comme ceci:

Cursor c = mApp.getContentResolver().query(ContactsContract.Data.CONTENT_URI, 
    null, 
    null, 
    null, 
    ContactsContract.Data.CONTACT_ID + " ASC"); 

Vous obtiendrez une très grande table avec toutes les données. Ensuite, vous devez vérifier la colonne mimetype pour savoir quel type de données est contenu dans cette ligne. De cela, vous pouvez extraire tous les e-mails et les messages instantanés pour un contact donné.

+0

Merci c'est en fait l'approche que j'ai fini par utiliser. –

0

Il est possible que si vous développez votre propre fournisseur de contenu. Vous devez simplement ajouter un nouvel URI et exécuter une requête personnalisée lorsque vous le traitez.

Cependant, il est impossible si vous utilisez un fournisseur de contenu tiers parce que la base de données SQLite (ou autre chose) est encapsulée pour son consommateur.

1

Cette solution est plus simple: n'utilisez pas ContentResolver. Utilisez SQLiteDatabase db = bdd.getReadableDatabase() (BDD est votre SQLiteHelper) puis:

db.rawquery ("HERE YOU WRITE YOUR QUERY WITH TWO TABLES", "HERE SelectionArgs"). 

Exemple:

db.rawquery("SELECT a.*, b.id FROM TableA AS a, TableB AS b WHERE a.id=b.id", null); 

ou même avec un autre en tapant:

db.rawquery("SELECT a.*, b.id FROM TableA AS a, TableB AS b WHERE a.id=?", "b.id"); 

J'espère que cela aide. ;-)

+2

Cette approche fonctionnera si vous avez accès à la base de données, mais lorsque vous travaillez avec des contacts, nous devons utiliser ContentResolver. Vérifiez aussi votre dernier exemple, il ne compilera probablement pas puisque '" b.id "' n'est pas un 'String []' et il ne fera probablement pas ce que vous attendez de lui. – Sam

Questions connexes