SQL 数据库错误

SQL Database error

我在从数据库中删除数据时遇到问题。我有一个在两种状态之间切换的按钮。向数据库中添加数据和从数据库中删除数据。这是代码:

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

第一次点击数据保存完美,但第二次点击数据''is removed''但我得到这个奇怪的错误...

04-05 14:57:18.540 11162-11162/com.example.android.popularmovies1 E/SQLiteLog: (1) near "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)

此外,我有 activity 可以看到保存的数据,如果单击保存按钮,它会列在 activity 上。问题是如果我从数据库 activity 从数据库中删除数据,只有当我离开 activity 然后返回时,该数据才会删除 ...

这是数据库的提供程序

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

}

当执行 if 语句时 (favourite = true),没有任何内容添加到您的内容值中,然后在最后一行中您尝试插入没有值的数据库,可能只是 return -1在 if 语句的最后一位并将最后的 return 语句移动到 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);
    }        
}