База данных Android ContentProvider запрашивает несколько таблиц - PullRequest
11 голосов
/ 07 мая 2010

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

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

}

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

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

Спасибо

Антек

1 Ответ

18 голосов
/ 07 июля 2010

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

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

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

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

Удачи:)

...