安卓ContentProvider数据库查询多个表

12

我正在为Android编写一个RSS阅读器。 我遇到了一些困难,因为数据库不是我的专长。 所以我想也许你们中的某个人可以帮助我! 我目前有3个表(类别,链接和源)。 我的目标是将源链接到多个类别。 因此,我正在使用Link表。 我的数据库是一个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);       

}

现在我的问题是:

我想知道如何优化这个数据库布局、代码或查询,以便以更高效的方式获取我的条目。因为我认为这个链接表或检索链接的查询是不必要的!或者我这样做是正确的吗?

谢谢,

Antek

1个回答

18

虽然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

祝你好运 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接