2010-05-07 4 views
11

Я пишу RSS-ридер для Android. Я столкнулся с определенными трудностями, с которыми проблема, которую я не могу решить, поскольку базы данных не являются моей экспертизой. Поэтому я понял, что один из вас может помочь мне! В настоящее время у меня есть 3 таблицы (категории, ссылки и каналы). Моя цель слишком связана ссылкой на несколько категорий. Поэтому я использую таблицу ссылок. Мои базы данных является Android ContentProvider (SQLite) и выглядят следующим образом:Android ContentProvider запрос базы данных несколько таблиц

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

В настоящее время я написал следующий код в моем FeedListActivity, чтобы получить список ссылок и их кормов.

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

} 

Теперь мой вопрос:

мне было интересно, как я могу оптимизировать этот макет базы данных, коду или запрос, так что я хотел бы получить мои записи в более эффективном способе. Потому что я считаю, что эта таблица ссылок или запрос на получение ссылок не нужны! Или я делаю это правильно?

Спасибо,

Антек

ответ

18

Хотя ответ CommonsWare является правильным в какой-то степени я считаю, что не в полной мере ответить на этот вопрос.

Обычно ContentProviders - это способ совместного использования/раскрытия данных приложения, и на самом деле это часто бывает так. Тем не менее, может возникнуть ситуация, когда нужно объединить несколько таблиц с помощью ContentProvider.

Замечательная вещь в Android заключается в том, что это Open Source, поэтому ничто не мешает вам искать в приложениях Android для подобных сценариев. Это то, что я обычно делаю в таких ситуациях. Хорошим примером является пример ContactsProvider.java. Это немного сложно, но работа над ним может дать некоторое представление о том, как использовать объединения внутри ContentProviders. Если вы не хотите, чтобы загрузить исходный код, вы можете нашли его на GitHub:

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

Удачи :)

Смежные вопросы