0

I've got two SQL tables inner join with content provider query builder. My loader shows the first in a gridview like a charm. The second table has been created to show a favorite list and so it has primary key, foreign key and another column. By the way when I try to retrieve value from this one I get null. Some suggestions, please!

I have this in content provider:

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

    }
Domenico Maiuri
  • 191
  • 1
  • 1
  • 10

2 Answers2

0

Instead of:

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

Create a string so you can debug it easy.

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

Then try to run that join direct on db. My guess is the query have some issues.

Juan Carlos Oropeza
  • 47,252
  • 12
  • 78
  • 118
0

I checked and the query works good. But my method can't return anything

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
        );
    }
Domenico Maiuri
  • 191
  • 1
  • 1
  • 10