La base de données Android ContentProvider interroge plusieurs tables
Je suis en train d'écrire un lecteur de flux RSS pour Android. J'ai été confronté à une certaine difficulté de le problème, je ne peux pas résoudre depuis les bases de données ne sont pas mon domaine.. Alors j'ai pensé que peut-être l'un de vous pourrait m'aider! J'ai actuellement 3 tables (les Catégories, des liens et des flux). Mon objectif est trop lien à un flux de plusieurs catégories. À cet effet, je suis en utilisant une table de Liaison. Mes bases de données est un Android ContentProvider (sqlite) et se présente comme suit:
| Categories | | Links | | Feeds |
|------------| |---------| |-------|
| _ID | | Category| | _ID |
| Title | | Feed | | Title |
| URL |
Je suis actuellement a écrit le code suivant dans mon FeedListActivity pour récupérer une liste de liens et de leur flux.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//gets the intent URI to retrieve the Feeds.
Intent intent = getIntent();
if (intent.getData() == null) {
intent.setData(Feeds.CONTENT_URI);
}
// stores the Category id so it knows from what category it came from
mCatId = intent.getIntExtra("catId", -1);
getListView().setOnCreateContextMenuListener(this);
// gets all Links that have the category placed
Cursor links = managedQuery(
Links.CONTENT_URI,
NewsReadUtils.LINK_PROJECTION_STRING,
Links.CATEGORY+ " = "+ mCatId, null, null);
String query = "";
Cursor cursor = null;
if(links.getCount()>0){
// if there are links available try to get them and build a query.
links.moveToFirst();
do{
if (links.isFirst()) {
query = Feeds._ID+ " = "+links.getString(links.getColumnIndex(Links.FEED));
}else{
query += " OR " +Feeds._ID+ " = "+links.getString(links.getColumnIndex(Links.FEED));
}
}while(links.moveToNext());
cursor = managedQuery(getIntent().getData(), PROJECTION ,query, null,
Feeds.DEFAULT_SORT_ORDER);
}
Cursor cursor = managedQuery(getIntent().getData(), PROJECTION ,Feeds._ID+ " = "+ mCatId, null,
Feeds.DEFAULT_SORT_ORDER);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor,
new String[] { Feeds.TITLE }, new int[] { android.R.id.text1 });
setListAdapter(adapter);
}
Maintenant, ma question:
Je me demandais comment je pourrais optimiser cette disposition de base de données, un code ou une requête donc, je voudrais obtenir mon entrées dans une manière plus efficace. Parce que je crois que ce lien la table ou la requête pour récupérer des liens n'est pas nécessaire! Ou suis-je le faire de la bonne façon?
Merci,
Antek
source d'informationauteur Antek Drzewiecki | 2010-05-07
Vous devez vous connecter pour publier un commentaire.
Tout CommonsWare réponse du droit à un certain degré, je trouve qu'il n'a pas entièrement répondu à la question.
Normalement ContentProviders sont un moyen de partager et exposer les données de l'application et, en fait, cela peut souvent être le cas. Encore, il se peut que la situation où on a besoin de joindre plusieurs tables à l'aide d'un ContentProvider.
La grande chose au sujet d'Android est qu'il est Open Source, donc rien ne vous empêche d'aller à la recherche dans les applications Android pour les scénarios similaires. C'est ce que j'ai l'habitude de le faire dans de telles situations. Le
ContactsProvider.java
est un bon exemple. C'est un peu complexe, mais il peut donner quelques idées sur la façon d'utiliser les jointures dans ContentProviders. Si vous ne souhaitez pas télécharger de la source, vous pouvez le trouver sur GitHub:https://github.com/android/platform_packages_providers_contactsprovider/blob/master/src/com/android/providers/contacts/ContactsProvider2.java
Bonne chance 🙂