如何删除SQLiteDatabase中的行 - Android Content Provider

时间:2016-01-11 16:40:58

标签: android android-sqlite android-contentprovider sqliteopenhelper

我正在努力编写一个从SQLiteDatabase中删除行的方法。我在gridview中有一个歌曲列表,当用户点击列表中的一个项目时,应用程序会将它们带到我的SongDetailFragment活动中,该活动包含有关歌曲和星形按钮的更多信息,如果数据库中有一首歌曲,星形按钮是“开启”,相反如果项目不在数据库中,则星形按钮被“关闭”

当用户点击星形按钮时,我可以在数据库中成功添加歌曲,并且我的星形按钮已“开启”。现在我想再次按下相同的按钮并调用deleteFromDB()来删除添加到数据库的歌曲。所以我在onClick上有以下代码:

>>> l = map(lambda _: [0] * 3, xrange(4))
>>> l[0][1] = 2
>>> l
[[0, 2, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

问题是deleteFromDB()方法无法正常工作,因为我可以看到歌曲没有从数据库中删除。我不确定修复它的正确语法是什么。

这是我的方法:

 public void onClick(View v)
            {

                if  (mIsFavourite) {

                   deleteFromDB();

                }

                else {
                    insertData();
                    mIsFavourite = true;
                }

以下是我的ContentProvider类的删除方法代码段:

   private void deleteFromDB() {

        ContentValues songValues = new ContentValues();


        getActivity().getContentResolver().delete(SongContract.SongEntry.CONTENT_URI,
                SongContract.SongEntry.COLUMN_TITLE + " = ?",
                new String[]{songValues.getAsString(song.getTitle())});

      //switch off button
        imgViewFavButton.setImageResource(android.R.drawable.btn_star_big_off);
    }

这是我的SongDetailFragment:

  @Override
    public int delete(Uri uri, String selection, String[] selectionArgs){
        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        final int match = sUriMatcher.match(uri);
        int numDeleted;
        switch(match){
            case SONG:
                numDeleted = db.delete(
                        SongContract.SongEntry.TABLE_NAME, selection, selectionArgs);
                // reset _ID
                db.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME = '" +
                        SongContract.SongEntry.TABLE_NAME + "'");
                break;
            case SONG_WITH_ID:
                numDeleted = db.delete(SongContract.SongEntry.TABLE_NAME,
                        SongContract.SongEntry._ID + " = ?",
                        new String[]{String.valueOf(ContentUris.parseId(uri))});
                // reset _ID
                db.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME = '" +
                        SongContract.SongEntry.TABLE_NAME + "'");

                break;
            default:
                throw new UnsupportedOperationException("Unknown uri: " + uri);
        }

        return numDeleted;
    }

1 个答案:

答案 0 :(得分:1)

请注意此行:

 ContentValues songValues = new ContentValues();
 getActivity().getContentResolver().delete(SongContract.songEntry.CONTENT_URI,
            SongContract.songEntry.COLUMN_TITLE + " = ?",
            new String[]{songValues.getAsString(song.getTitle())});

您将songValues设置为空的ContentValues对象,稍后调用getAsString()将返回null,因为它不包含song.getTitle()的任何键。

只需将您的数组更改为歌曲标题,您就不需要ContentValues了:

new String[]{song.getTitle()});