我找到了一个使用 ContentProvider 子类的解决方案。
假设您有表 tblA 和另一个表 tblB。我建议创建两个类“AContentProvider”和“BContentProvider”。最重要的是,确保两个表都设置在同一个数据库中。
解决方案的主要部分是在 ContentProvider 中覆盖 ContentProvider.query(),您将从 CursorLoader 调用 - URI 决定它是哪一个:
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sort) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(
"tblA LEFT JOIN tblB"
+ " ON ("
+ "tblA.b_id"
+ " = "
+ "tblB.id"
+ ")"
);
...
// Content of projection is set by CursorLoader
// usually in an Activity that implements LoaderManager.LoaderCallbacks<>
Cursor c = qb.query(
database,
projection,
selection,
selectionArgs,
groupBy,
having,
orderBy
);
...
return c;
}
如您所见,JOIN 是在 setTables() 中完成的。使用 projection 您可以确保只显示您真正需要的列,最重要的是,您没有重复的列,例如两个表中的“id”:
final String[] projection = new String[] {
"tblA.*",
"tblB.columnThatOnlyBHas"
};
利用覆盖并尝试在子类中完成尽可能多的工作;例如:如果游标结果集发生变化,我所有重写的 query() 方法都会调用 setNotificationUri() 来通知 ContentResolver。:
c.setNotificationUri(getContext().getContentResolver(), uri);