我需要创建一个ListAdapter来呈现来自多个ContentProviders的数据。 ContentProviders本身代表一个来自关系数据库的表。
我想使用CursorLoader系统将聚合数据检索到ListView中。 这可能与1个装载机有关,还是需要使用多个装载机? 我更喜欢用一个。
我不确定除了在代码中手动连接之外我怎么能让2个ContentProviders互相交互,这似乎也不是一个很好的选择。
我需要创建一个ListAdapter来呈现来自多个ContentProviders的数据。 ContentProviders本身代表一个来自关系数据库的表。
我想使用CursorLoader系统将聚合数据检索到ListView中。 这可能与1个装载机有关,还是需要使用多个装载机? 我更喜欢用一个。
我不确定除了在代码中手动连接之外我怎么能让2个ContentProviders互相交互,这似乎也不是一个很好的选择。
您必须编写Custom Loader类。例如:
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) {
}
}
您必须编写Custom Loader类。例如:
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) {
}
}
你可能想看看 CursorJoiner。
我自己是ContentLoaders的新手,但我还没有看到过使用一个ContentLoader来处理多个ContentProviders的方法。
您在不同的数据库中查询表吗?你的问题并不清楚。如果表都在同一个数据库中,则一种替代方法可能是将一个ContentProvider用于单独的表。数据可以连接并返回到一个游标,这意味着您可以使用一个CursorLoader。 SQLiteQueryBuilder.setTables()方法有一些信息:
你可以在这里看到它: