【问题标题】:Restar Loader can't update gridviewRestar Loader 无法更新 gridview
【发布时间】:2015-12-08 23:58:06
【问题描述】:

我有两个带有内容提供程序查询构建器的 SQL 表内部连接。我的加载器在网格视图中显示第一个,就像一个魅力。已创建第二个表以显示收藏夹列表,因此它具有主键、外键和另一列。顺便说一句,当我尝试从中检索值时,我得到了 null。请给点建议!

我在内容提供者中有这个:

static {
        sMovieByFavoriteQueryBuilder = new SQLiteQueryBuilder();

        sMovieByFavoriteQueryBuilder.setTables(
                MoviesContract.FavoriteEntry.TABLE_NAME + " INNER JOIN " +
                        MoviesContract.MovieEntry.TABLE_NAME +
                        " ON " +  MoviesContract.FavoriteEntry.TABLE_NAME +
                        "." +  MoviesContract.FavoriteEntry.COLUMN_FAVORITE_KEY +
                        " = " + MoviesContract.MovieEntry.TABLE_NAME +
                        "." + MoviesContract.MovieEntry._ID);
    }

    private static final String sFavoriteSelection =
            MoviesContract.FavoriteEntry.TABLE_NAME +
                    "." + MoviesContract.FavoriteEntry.COLUMN_MOVIE_ID + " = ? AND " +
                    MoviesContract.FavoriteEntry.COLUMN_MOVIE_POSTER + " = ? AND " +
                    MoviesContract.MovieEntry.COLUMN_RELEASE_DATE + " = ? AND " +
                    MoviesContract.MovieEntry.COLUMN_MOVIE_POSTER + " = ? AND " +
                    MoviesContract.MovieEntry.COLUMN_ORIGINAL_TITLE + " = ? AND " +
                    MoviesContract.MovieEntry.COLUMN_SYNOSIS + " = ? AND " +
                    MoviesContract.MovieEntry.COLUMN_USER_RATING + " = ? ";

I call this method by uri from fragment:
@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        getLoaderManager().initLoader(MOVIES_LOADER, null, this);
        getLoaderManager().initLoader(FAVORITE_LOADER, null, this);
        super.onActivityCreated(savedInstanceState);
    }

    void onSortChanged() {
        System.out.println("onSortChanged: true");
        updateMovies();
        getLoaderManager().restartLoader(MOVIES_LOADER, null, this);
        System.out.println("LoaderManager: " + getLoaderManager().restartLoader(MOVIES_LOADER, null, this));
    }

    void onFavorite() {

        getLoaderManager().restartLoader(FAVORITE_LOADER, null, this);
        mMoviesAdapter.setSelectedIndex(mPosition);
        mMoviesAdapter.notifyDataSetChanged();
    }


    private void updateMovies() {
        PopularMoviesSyncAdapter.syncImmediately(getActivity());
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {

        if (MainActivity.mFavorite == true) {
            String sortOrder = MoviesContract.FavoriteEntry.COLUMN_FAVORITE_KEY;
            String sortSetting = Utility.getPreferredSort(getActivity());
            Uri movieFavoriteUri = MoviesContract.MovieEntry.buildMovieWithSortDate(sortSetting, System.currentTimeMillis());
            System.out.println("movieFavoriteUri: " + movieFavoriteUri);
            cursorFav = new CursorLoader(getActivity(),
                    movieFavoriteUri,
                    FAVORITE_COLUMNS,
                    null,
                    null,
                    sortOrder);
            return cursorFav;

        } else {
            String sortOrder = MoviesContract.MovieEntry.COLUMN_DATE;
            String sortSetting = Utility.getPreferredSort(getActivity());
            System.out.println("sortSetting: " + sortSetting);
            Uri movieForSortUri = MoviesContract.MovieEntry.buildMovieSort(sortSetting);

            System.out.println("movieForSortUri: " + movieForSortUri);
            cursorMov = new CursorLoader(getActivity(),
                    movieForSortUri,
                    MOVIES_COLUMNS,
                    null,
                    null,
                    sortOrder);
            return cursorMov;

        }
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        mMoviesAdapter.swapCursor(data);
        if (mPosition != GridView.INVALID_POSITION) {
            // If we don't need to restart the loader, and there's a desired position to restore
            // to, do so now.
            mGridView.smoothScrollToPosition(mPosition);
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mMoviesAdapter.swapCursor(null);

    }

【问题讨论】:

  • 所以如果你查询每个单独的表而不连接你会得到数据吗?如果是这种情况,问题是你如何加入。你能给我们看点别的吗?
  • 是的,我只能加入

标签: sql android-contentprovider loader


【解决方案1】:

代替:

    sMovieByFavoriteQueryBuilder.setTables(
            MoviesContract.FavoriteEntry.TABLE_NAME + " INNER JOIN " +
                    MoviesContract.MovieEntry.TABLE_NAME +
                    " ON " +  MoviesContract.FavoriteEntry.TABLE_NAME +
                    "." +  MoviesContract.FavoriteEntry.COLUMN_FAVORITE_KEY +
                    " = " + MoviesContract.MovieEntry.TABLE_NAME +
                    "." + MoviesContract.MovieEntry._ID);

创建一个字符串,以便您轻松调试。

strTables = MoviesContract.FavoriteEntry.TABLE_NAME + " INNER JOIN " +
                    MoviesContract.MovieEntry.TABLE_NAME +
                    " ON " +  MoviesContract.FavoriteEntry.TABLE_NAME +
                    "." +  MoviesContract.FavoriteEntry.COLUMN_FAVORITE_KEY +
                    " = " + MoviesContract.MovieEntry.TABLE_NAME +
                    "." + MoviesContract.MovieEntry._ID);

sMovieByFavoriteQueryBuilder.setTables(strTables);

然后尝试在 db 上直接运行该连接。我的猜测是查询有一些问题。

【讨论】:

  • 你是对的,卡洛斯。我的查询有问题。使用 rawquery 而不是 SQLiteQueryBuilder 解决
【解决方案2】:

我检查了,查询运行良好。但是我的方法不能返回任何东西

private Cursor getMovieByFavorite(Uri uri, String[] projection, String movieId) {
        String sortSetting = MoviesContract.MovieEntry.getFavoriteFromUri(uri);
        long date = MoviesContract.MovieEntry.getDateFromUri(uri);
        String[] selectionArgs;
        String selection;

        selection = sFavoriteSelection;
        selectionArgs = new String[]{sortSetting};

        return sMovieByFavoriteQueryBuilder.query(mOpenHelper.getReadableDatabase(),
                projection,
                selection,
                null,
                null,
                null,
                movieId
        );
    }

【讨论】:

  • 这可能应该作为另一个问题。但是sMovieByFavoriteQueryBuilder.query() 的回报是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多