我正在努力编写一个从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;
}
答案 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()});