【问题标题】:CursorLoader for Multiple ContentProviders多个 ContentProviders 的 CursorLoader
【发布时间】:2011-12-08 13:36:25
【问题描述】:

我需要创建一个 ListAdapter 来呈现来自多个 ContentProvider 的数据。 ContentProvider 本身代表关系数据库中的一个表。

我想使用 CursorLoader 系统将聚合数据检索到 ListView 中。 这可以使用 1 个加载器还是我需要使用多个加载器?我更喜欢使用一个。

我不确定如何让 2 个 ContentProviders 相互交互,而不是在代码中手动进行连接,这似乎也不是一个好选择。

【问题讨论】:

    标签: android database android-contentprovider listadapter android-cursorloader


    【解决方案1】:

    您必须编写一个自定义加载器类。例如:

    public class FooLoader extends AsyncTaskLoader {
    
        Context context;
    
        public FooLoader(Context context) {
            super(context);
            this.context = context;
        }
    
        @Override
        public Cursor loadInBackground() {
            Log.d(TAG, "loadInBackground");
            YourDatabase dbHelper = new YourDataBase(context);
            SQLiteDatabase db= dbHelper.getReadableDatabase();
    
            /*** create a custom cursor whether it is join of multiple tables or complex query**/
            Cursor cursor = db.query(<TableName>, null,null, null, null, null, null, null);
            return cursor; 
        }
    }
    

    在调用活动或片段onCreate() 方法中,您需要调用自定义加载器类:

    public class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "onCreate():" + mContent);
            Loader loader = getLoaderManager().initLoader(0, null, this);
            loader.forceLoad();
        }   
    
        @Override
        public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
            Log.d(TAG, "onCreateLoader()")  ;
            return new FooLoader(getActivity());
        }
    
        @Override
        public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
            Log.d(TAG, "onLoadFinished");            
        }
    
        @Override
        public void onLoaderReset(Loader<Cursor> cursorLoader) {   
        }
    }
    

    【讨论】:

    • 抱歉,“多个 ContentProviders”与“我的应用程序数据库中的多个表”不同。 ContentProviders 可能来自不同的应用程序,在这种情况下,您的解决方案不是解决方案。 (死灵贴,但也许有人有提示)
    【解决方案2】:

    你可能想看看CursorJoiner.

    【讨论】:

      【解决方案3】:

      我自己是 ContentLoaders 的新手,但我还没有看到一种可以使用一个 ContentLoader 来处理多个 ContentProviders 的方法。

      您要查询的表是否在不同的数据库中?从你的问题看不清楚。如果这些表都在同一个数据库中,一种替代方法可能是使用一个 ContentProvider 来处理单独的表。数据可以连接并返回到一个游标,这意味着您可以使用一个 CursorLoader。 SQLiteQueryBuilder.setTables() 方法对此有一些信息:

      http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html#setTables%28java.lang.String%29

      您可以在这里看到它的实际效果:

      http://code.google.com/p/openintents/source/browse/trunk/shoppinglist/ShoppingList/src/org/openintents/shopping/provider/ShoppingProvider.java

      这也可能会有所帮助: https://stackoverflow.com/a/3196484/399105

      【讨论】:

        猜你喜欢
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 2016-10-24
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多