SQLite使用内容提供程序检索外键值

时间:2017-10-25 08:09:49

标签: android sqlite android-sqlite android-contentprovider android-loader

我的Android应用程序中有一个带有“label”和“idea”表的sqlite数据库。在idea table上创建了一个外键,作为idea_label,其int值连接到_id上的label_table。

enter image description here

我使用Loader将我的Cursor加载到mainActivity上,该mainActivity从提供者加载我的idea表。很明显它加载了idea_label int(但我要求的是加载label_table中设置label_body的值)。

我在mainActivity类上的加载器

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    String[] projection = {
            DatabaseContract.IdeaEntry._ID,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_NAME,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_DESCRIPTION,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_DATE,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_LABEL,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_ICON,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_IS_ACTIVE,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_IS_FAVORITE,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_IS_DONE,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_IS_ARCHIVED,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_ORDER,
    };


    return new CursorLoader(this,
            DatabaseContract.IdeaEntry.CONTENT_URI_IDEA,
            projection,
            null,   // selection
            null,   // selectionArgs
            DatabaseContract.IdeaEntry.COLUMN_IDEA_ORDER   // order
    );
}

在我的提供者类

上调用此部分
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    SQLiteDatabase database = mDatabaseHelper.getReadableDatabase();
    Cursor cursor;

    int match = sUriMatcher.match(uri);
    switch (match){
        case IDEAS:
            cursor = database.query(DatabaseContract.IdeaEntry.IDEA_TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);

有办法吗?触发另一个装载机或者我的实施在这种情况下是错误的?任何指导我正确方向的方式或帮助都将非常感激。

2 个答案:

答案 0 :(得分:1)

使用SQLiteQueryBuilder,您可以在setTables方法中连接表,然后在投影中指定标签表的label_body列。

        String[] projection = {
        DatabaseContract.IdeaEntry._ID,
        ....          
        DatabaseContract.LabelEntry.COLUMN_LABEL_BODY,
        };

        ...

        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
        builder.setTables("IDEA JOIN LABEL ON IDEA.IDEA_LABEL = LABEL._ID");
        builder.query(database, projection, selection, selectionArgs, null, null, sortOrder);

答案 1 :(得分:0)

感谢@gar_r帮助和指导我,我确实喜欢使用DatabaseContract常量:

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    String[] projection = {
            DatabaseContract.IdeaEntry.IDEA_TABLE_NAME + "." + DatabaseContract.IdeaEntry._ID,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_NAME,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_DESCRIPTION,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_DATE,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_LABEL,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_ICON,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_IS_ACTIVE,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_IS_FAVORITE,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_IS_DONE,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_IS_ARCHIVED,
            DatabaseContract.IdeaEntry.COLUMN_IDEA_ORDER,
            DatabaseContract.LabelEntry.COLUMN_LABEL_BODY,
    };

    return new CursorLoader(this,
            DatabaseContract.IdeaEntry.CONTENT_URI_IDEA,
            projection,
            null,   // selection
            null,   // selectionArgs
            DatabaseContract.IdeaEntry.COLUMN_IDEA_ORDER   // order
    );
}

在我的提供者类

上调用此部分
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    SQLiteDatabase database = mDatabaseHelper.getReadableDatabase();
    Cursor cursor;

    int match = sUriMatcher.match(uri);
    switch (match){
        case IDEAS:
            SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
            builder.setTables(DatabaseContract.IdeaEntry.IDEA_TABLE_NAME + " JOIN " + DatabaseContract.LabelEntry.LABEL_TABLE_NAME
                    + " ON " + DatabaseContract.IdeaEntry.COLUMN_IDEA_LABEL + " = " + DatabaseContract.LabelEntry.LABEL_TABLE_NAME + "." + DatabaseContract.LabelEntry._ID);
            cursor = builder.query(database, projection, selection, selectionArgs, null, null, sortOrder);
            break;