如何使用Android ListFragment显示来自多个表的数据

时间:2014-01-28 14:27:21

标签: android sql sqlite

我有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。是否有一种从多个表中选择数据的简单方法?

1 个答案:

答案 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);