2010-05-07 22 views
11

Estoy escribiendo un lector RSS para Android. Me he enfrentado a cierta dificultad que el problema no puedo resolver porque las bases de datos no son mi experiencia. ¡Así que pensé que alguno de ustedes podría ayudarme! Actualmente tengo 3 tablas (categorías, enlaces y fuentes). Mi objetivo es vincular un feed a múltiples categorías. Por lo tanto, estoy usando una tabla de enlaces. Mis bases de datos es un ContentProvider Android (sqlite) y se parece a lo siguiente:Android ContentProvider database query multiple tables

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

Actualmente me escribió el siguiente código en mi FeedListActivity para recuperar una lista de enlaces y sus feeds.

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

} 

Ahora mi pregunta:

Me preguntaba cómo podría optimizar este diseño de base de datos, código o consulta, por lo que obtendría mis entradas de una manera más eficiente. ¡Porque creo que esta tabla de enlaces o la consulta para recuperar enlaces no es necesaria! ¿O estoy haciendo esto de la manera correcta?

Gracias,

Antek

Respuesta

18

Si bien la respuesta de CommonsWare es correcto hasta cierto punto me parece que no responde a la pregunta totalmente.

Normalmente los ContentProviders son una forma de compartir/exponer los datos de la aplicación y, de hecho, este puede ser el caso a menudo. Aún así, puede surgir la situación en la que uno necesita unir múltiples tablas usando ContentProvider.

Lo bueno de Android es que es de código abierto, por lo que nada le impide ir a buscar en las aplicaciones de Android para escenarios similares. Esto es lo que suelo hacer en tales situaciones. El ContactsProvider.java es un buen ejemplo. Es un poco complejo, pero trabajar a través de él puede brindar algunas ideas sobre cómo usar las uniones dentro de ContentProviders. Si no desea descargar el código fuente puede encontrado en GitHub:

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

Buena suerte :)

Cuestiones relacionadas