База данных Android ContentProvider запрашивает несколько таблиц
Я пишу 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
Хотя ответ 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
Удачи:)