11

我需要制作一个ListAdapter来呈现来自多个ContentProvider的数据。 ContentProviders本身代表每个来自关系数据库的表。多个内容提供者的CursorLoader

我想使用CursorLoader系统将聚合数据检索到ListView中。 这是可能与1加载器或我需要使用多个加载器吗?我宁愿使用一个。

我不知道我怎么可以让2个ContentProviders互相之间进行交互,除了在代码中手动执行加入,这看起来不是一个好的选项。

回答

12

您将不得不编写自定义加载程序类。例如:

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) { 
    } 
} 
+0

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

0

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

你在单独的数据库中查询的表是?你的问题并不清楚。如果这些表都在同一个数据库中,则可以使用一个ContentProvider替代单独的表。数据可以连接并返回到一个游标,这意味着您可以使用一个CursorLoader。

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

()方法有一些这方面的信息SQLiteQueryBuilder.setTables