2010-05-07 6 views
11

Je suis en train d'écrire un lecteur RSS pour Android. J'ai fait face à une certaine difficulté que le problème que je ne peux pas résoudre puisque les bases de données ne sont pas mon expertise. Ainsi j'ai compris que peut-être l'un d'entre vous pourrait m'aider! J'ai actuellement 3 tables (catégories, liens et flux). Mon objectif est aussi de lier un flux à plusieurs catégories. Pour cette raison, j'utilise une table Link. Mes bases de données est un Android ContentProvider (sqlite) et ressemble à ce qui suit:Android ContentProvider requête de base de données plusieurs tables

| Categories |   | Links |   | Feeds | 
|------------|   |---------|   |-------| 
| _ID  |   | Category|   | _ID | 
| Title  |   | Feed |   | Title | 
              | URL | 

j'ai écrit actuellement le code suivant dans mon FeedListActivity pour récupérer une liste de liens et de leurs 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);  

} 

Ma question:

Je me demandais comment je pourrais optimiser cette mise en page de base de données, le code ou une requête afin que je recevrais mes entrées d'une manière plus efficace. Parce que je crois que cette table de liens ou la requête pour récupérer des liens n'est pas nécessaire! Ou est-ce que je le fais de la bonne façon?

Merci,

Antek

Répondre

18

Alors que la réponse de CommonsWare est juste dans une certaine mesure, je trouve qu'il ne répond pas entièrement à la question.

Normalement ContentProviders est un moyen de partager/exposer les données de l'application et, en fait, cela peut souvent être le cas. Cependant, il peut arriver que vous deviez rejoindre plusieurs tables à l'aide d'un ContentProvider.

La bonne chose à propos d'Android est qu'il est Open Source, donc rien ne vous empêche d'aller chercher dans les applications Android pour des scénarios similaires. C'est ce que je fais habituellement dans de telles situations. Le ContactsProvider.java est un bon exemple. C'est un peu complexe, mais le fait de travailler dessus peut donner des informations sur l'utilisation des jointures dans ContentProviders. Si vous ne souhaitez pas télécharger la source que vous pouvez trouver sur GitHub:

https://github.com/android/platform_packages_providers_contactsprovider/blob/master/src/com/android/providers/contacts/ContactsProvider2.java

Bonne chance :)

Questions connexes