2010-05-07 2 views
11

Ich schreibe einen RSS-Reader für Android. Ich habe mit einer gewissen Schwierigkeit konfrontiert, die das Problem nicht lösen kann, da Datenbanken nicht meine Expertise sind. Also habe ich herausgefunden, dass vielleicht einer von euch mir helfen könnte! Ich habe derzeit 3 ​​Tabellen (Kategorien, Links und Feeds). Mein Ziel ist es, einen Feed mit mehreren Kategorien zu verknüpfen. Daher verwende ich eine Link-Tabelle. Meine Datenbanken ist ein Android-Contentprovider (SQLite) und sieht wie folgt aus:Android ContentProvider Datenbank Abfrage mehrere Tabellen

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

ich zur Zeit den folgenden Code in meinem FeedListActivity schrieb eine Liste von Links und deren Feeds abzurufen.

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

} 

Nun meine Frage:

Ich habe mich gefragt, wie ich diesen Datenbank-Layout optimieren könnte, Code oder Abfrage, so würde ich meine Einträge in einer effizienteren Weise. Weil ich glaube, dass diese Link-Tabelle oder die Abfrage zum Abrufen von Links nicht benötigt wird! Oder mache ich das richtig?

Danke,

Antek

Antwort

18

Während CommonsWare Antwort richtig ist bis zu einem gewissen Grad finde ich es die Frage nicht vollständig beantworten.

Normalerweise sind ContentProvider eine Möglichkeit, die Daten der Anwendung zu teilen/verfügbar zu machen, und dies ist oft der Fall. Dennoch kann die Situation auftreten, in der mehrere Tabellen mit einem ContentProvider verknüpft werden müssen.

Das Tolle an Android ist, dass es Open Source ist, also hindert Sie nichts daran, in den Android Apps nach ähnlichen Szenarien zu suchen. Dies ist, was ich normalerweise in solchen Situationen tue. Die ContactsProvider.java ist ein gutes Beispiel. Es ist ein wenig komplex, aber das Durcharbeiten kann einige Einblicke in die Verwendung von Joins in ContentProviders geben. Wenn Sie möchten, um die Quelle nicht herunterladen können Sie es auf GitHub gefunden:

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

Viel Glück :)