我有Android app跟踪习惯并在ListFragment中显示记录事件的列表,充当游标LoaderManager:
public class EventListFragment extends ListFragment
implements LoaderManager.LoaderCallbacks<Cursor>
我面临的问题是我想记录情绪信息并将其显示在事件列表中。我正确记录数据,但我不确定如何从event
表和reading
表中获取数据。
目前我使用onCreateLoader
方法返回数据:
static final String[] EVENTS_PROJECTION = new String[] {
EventTable.TABLE_EVENT + "." + EventTable.COLUMN_ID,
HabitTable.COLUMN_NAME,
HabitTable.COLUMN_COLOR,
EventTable.TABLE_EVENT + "." + EventTable.COLUMN_TIME
};
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(), HabitContentProvider.EVENTS_URI, EVENTS_PROJECTION, null, null, EventTable.COLUMN_TIME + " DESC");
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// Populate list
}
执行以下查询:
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
⋮
queryBuilder.setTables(HabitTable.TABLE_HABIT + " JOIN " + EventTable.TABLE_EVENT
+ " ON " + HabitTable.TABLE_HABIT + "." + HabitTable.COLUMN_ID + " = " + EventTable.TABLE_EVENT + "." + EventTable.COLUMN_HABIT_ID);
⋮
SQLiteDatabase db = database.getWritableDatabase();
Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, groupBy, null, sortOrder);
这只允许我创建一个Cursor。是否有一种从多个表中选择数据的简单方法?
答案 0 :(得分:0)
我不确定你想要达到什么目的。
如果要指定多个端点以及它们在加载器级别上的连接方式,我不知道任何现有的解决方案。
如果你问Sql JOINs的方式比SQliteQueryBuilder的表格参数中的字符串连接更好,我最近为android-db-commons library写了一个流畅的sqlite接口,所以你可以写:
select()
.columns(projection)
.from(HabitTable.TABLE_HABIT)
.join(EventTable.TABLE_EVENT)
.on(column(HabitTable.TABLE_HABIT, HabitTable.COLUMN_ID).eq().column(EventTable.TABLE_EVENT, EventTable.COLUMN_HABIT_ID))
.where(selection, selectionArgs)
.orderBy(sortOrder);