Ошибка базы данных SQL

У меня проблема при удалении данных из базы данных. У меня есть кнопка для переключения между двумя состояниями. Добавление данных в базу данных и удаление данных из базы данных. Вот код:

//Method for adding or removing movies in favorite movie database
public long toggleFav(MovieData movieData) {
    ContentValues cv = new ContentValues();
    boolean favorite = isFav(movieData.getTitle());

    if (favorite) {
        favDb.delete(FavoriteContract.FavoriteEntry.TABLE_NAME,
                FavoriteContract.FavoriteEntry.COLUMN_ID, null);
        mFavoriteImage.setImageResource(R.drawable.fav_ic_no);
        movieData.setIsFav(false);
        Toast.makeText(MovieDetails.this, getString(R.string.remove_fav),
                Toast.LENGTH_SHORT).show();
    } else {
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_ID, movieData.getMovieId());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_POSTER, movieData.getPoster());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_TITLE, movieData.getTitle());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_RELEASE_DATE, movieData.getReleaseDate());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_AVERAGE_VOTE, movieData.getRating());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_SYNOPSIS, movieData.getSynopsis());

        mFavoriteImage.setImageResource(R.drawable.fav_ic_selected);
        Toast.makeText(MovieDetails.this, getString(R.string.add_fav),
                Toast.LENGTH_SHORT).show();
    }

    return favDb.insert(FavoriteContract.FavoriteEntry.TABLE_NAME, null, cv);
}

При первом щелчке данные сохраняются отлично, но при втором щелчке данные «удаляются», но я получаю эту странную ошибку ...

04-05 14: 57: 18.540 11162-11162 / com.example.android.popularmovies1 E / SQLiteLog: (1) рядом с "null": синтаксическая ошибка 04-05 14: 57: 18.541 11162-11162 / com.example.android.popularmovies1 E / SQLiteDatabase: Ошибка при вставке android.database.sqlite.SQLiteException: рядом с "null": синтаксическая ошибка (код 1): при компиляции: INSERT INTO fav_movies (null) VALUES (NULL)

Кроме того, у меня есть активность, когда я могу видеть сохраненные данные, и если нажать кнопку для сохранения, они будут перечислены в этом действии. Проблема в том, что если я из активности базы данных удаляю данные из базы данных, эти данные удаляются только тогда, когда я выхожу из этой активности, а затем возвращаюсь ...

Вот провайдер для базы данных

public class FavoritesProvider extends ContentProvider {

public static final int FAVORITES = 100;
public static final int FAVORITES_WITH_ID = 101;

private FavoriteDbHelper mFavoriteDbHelper;

private static final UriMatcher sUriMatcher = buildUriMatcher();

public static UriMatcher buildUriMatcher() {
    UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    uriMatcher.addURI(FavoriteContract.AUTHORITY, FavoriteContract.FAV_PATH, FAVORITES);
    uriMatcher.addURI(FavoriteContract.AUTHORITY,
            FavoriteContract.FAV_PATH + "/#", FAVORITES_WITH_ID);

    return uriMatcher;
}

@Override
public boolean onCreate() {
    Context context = getContext();
    mFavoriteDbHelper = new FavoriteDbHelper(context);
    return true;
}

@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
                    @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    final SQLiteDatabase db = mFavoriteDbHelper.getReadableDatabase();

    int match = sUriMatcher.match(uri);

    Cursor retCursor;

    switch(match) {
        case FAVORITES:
            retCursor = db.query(FavoriteContract.FavoriteEntry.TABLE_NAME,
                    projection,
                    selection,
                    selectionArgs,
                    null,
                    null,
                    sortOrder);
            break;
        case FAVORITES_WITH_ID:
            String id = uri.getPathSegments().get(1);

            String mSelection = FavoriteContract.FavoriteEntry.COLUMN_ID;
            String[] mSelectionArgs = new String[]{id};

            retCursor = db.query(FavoriteContract.FavoriteEntry.TABLE_NAME,
                    projection,
                    mSelection,
                    mSelectionArgs,
                    null,
                    null,
                    sortOrder);
            break;
        default:
            throw new UnsupportedOperationException("Uknown uri: " + uri);
    }

    retCursor.setNotificationUri(getContext().getContentResolver(), uri);

    return retCursor;
}

@Nullable
@Override
public String getType(@NonNull Uri uri) {
    int match = sUriMatcher.match(uri);

    switch(match) {
        case FAVORITES:
            return "vnd.android.cursor.dir" + "/" + FavoriteContract.AUTHORITY + "/" +
                    FavoriteContract.FAV_PATH;
        case FAVORITES_WITH_ID:
            return "vnd.android.cursor.item" + "/" + FavoriteContract.AUTHORITY + "/" +
                    FavoriteContract.FAV_PATH;
        default:
            throw new UnsupportedOperationException("Unknown uri: " + uri);
    }
}

@Nullable
@Override
public Uri insert(@NonNull Uri uri, ContentValues values) {
    final SQLiteDatabase db = mFavoriteDbHelper.getWritableDatabase();

    int match = sUriMatcher.match(uri);
    Uri retUri;

    switch(match) {
        case FAVORITES:
            long id = db.insert(FavoriteContract.FavoriteEntry.TABLE_NAME,
                    null, values);
            if (id > 0) {
                retUri = ContentUris.withAppendedId(FavoriteContract
                        .FavoriteEntry.CONTENT_URI, id);
            } else {
                throw new android.database.SQLException("Failed to insert row into " + id);
            }
            break;
        default:
            throw new UnsupportedOperationException("Unknown uri: " + uri);
    }

    getContext().getContentResolver().notifyChange(uri, null);

    return retUri;
}

@Override
public int delete(@NonNull Uri uri, String selection,
                  String[] selectionArgs) {
   final SQLiteDatabase db = mFavoriteDbHelper.getWritableDatabase();

    int match = sUriMatcher.match(uri);
    int favDeleted;

    switch(match) {
        case FAVORITES_WITH_ID:
            String id = uri.getPathSegments().get(1);

            favDeleted = db.delete(FavoriteContract.FavoriteEntry.TABLE_NAME,
                    FavoriteContract.FavoriteEntry.COLUMN_ID, new String[]{id});
            break;
        default:
            throw new UnsupportedOperationException("Unknown uri: " + uri);
    }

    if (favDeleted != 0) {
        getContext().getContentResolver().notifyChange(uri, null);
    }

    return favDeleted;
}

@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values,
                  @Nullable String selection, @Nullable String[] selectionArgs) {
    int match = sUriMatcher.match(uri);
    int favUpdated;

    switch(match) {
        case FAVORITES_WITH_ID:
            String id = uri.getPathSegments().get(1);

            favUpdated = mFavoriteDbHelper.getWritableDatabase().update(
                    FavoriteContract.FavoriteEntry.TABLE_NAME, values,
                    FavoriteContract.FavoriteEntry.COLUMN_ID, new String[]{id});
            break;
        default:
            throw new UnsupportedOperationException("Unknown uri: " + uri);
    }

    if (favUpdated != 0) {
        getContext().getContentResolver().notifyChange(uri, null);
    }

    return favUpdated;
}

}

И что такое favDb?

Selvin 05.04.2018 17:09

@Selvin - это имя SQLiteDatabase ... SQLiteDatabase favDb = MainActivity.getFavMoviesDb ();

Ivan Bumbak 05.04.2018 17:12

почему вы используете SQLiteDatabase напрямую, если у вас есть ContentProvider ... похоже, что Udacity ничего не может узнать (или, может быть, это не проблема Udacity) ... ошибка очевидна из-за того, что ContentValues ​​пуст

Selvin 05.04.2018 17:15

они делали вот так ...: / они используют ContentValues ​​в действии, а не в ContentProvider ...

Ivan Bumbak 05.04.2018 17:18
2
4
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда выполняется оператор if (favourite = true), к вашим значениям содержимого ничего не добавляется, а затем в последней строке вы пытаетесь вставить в базу данных без значений, возможно, просто верните -1 в последнем бите оператора if и переместите последний оператор возврата в else

может быть так

public long toggleFav(MovieData movieData) {

   boolean favorite = isFav(movieData.getTitle());

   if (favorite) {
        favDb.delete(FavoriteContract.FavoriteEntry.TABLE_NAME, FavoriteContract.FavoriteEntry.COLUMN_ID, null);
        mFavoriteImage.setImageResource(R.drawable.fav_ic_no);
        movieData.setIsFav(false);
        Toast.makeText(MovieDetails.this, getString(R.string.remove_fav), Toast.LENGTH_SHORT).show();
        return -1;  // favourite deleted

    } else {
        ContentValues cv = new ContentValues();
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_ID, movieData.getMovieId());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_POSTER, movieData.getPoster());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_TITLE, movieData.getTitle());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_RELEASE_DATE, movieData.getReleaseDate());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_AVERAGE_VOTE, movieData.getRating());
        cv.put(FavoriteContract.FavoriteEntry.COLUMN_SYNOPSIS, movieData.getSynopsis());

        mFavoriteImage.setImageResource(R.drawable.fav_ic_selected);
        Toast.makeText(MovieDetails.this, getString(R.string.add_fav),  Toast.LENGTH_SHORT).show();
        return favDb.insert(FavoriteContract.FavoriteEntry.TABLE_NAME, null, cv);
    }        
}

спасибо, теперь я не получаю ошибку :) ... но все же, если я прямо из базы данных нажимаю "удалить", он все еще там, но я думаю, что проблема в моем методе отображения сохраненных данных в базе данных

Ivan Bumbak 05.04.2018 17:23

Другие вопросы по теме