我正在我的音乐应用程序中创建一个“最近播放过的”播放列表。我已经创建了一个数据库来存储与歌曲相关的信息。我当前的代码所做的是,每当我播放一首歌曲时,它会将它添加到数据库中,然后我就可以成功地显示它。但问题是,当我播放同一首歌两次时,数据库没有更新。例如,我分别播放歌曲A、歌曲B、歌曲C、歌曲D。然后它将显示歌曲A,歌曲B,歌曲C,歌曲D。但是如果我分别播放歌曲A,歌曲B,歌曲C,歌曲D和歌曲B。然后它再次显示相同的内容(歌曲A、歌曲B、歌曲C、歌曲D)。但我想要的是:歌曲A,歌曲C,歌曲D,歌曲B。它应该更新并显示最新播放的歌曲,这就是我的意思。我想不出该怎么做。
创建表的代码:
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME+ "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_NAME + " TEXT,"
+ KEY_ARTIST + " TEXT,"
+ KEY_DURATION + " INTEGER,"
+ KEY_ART + " TEXT"
+ ");";
sqLiteDatabase.execSQL(CREATE_TABLE);
}获取和显示数据的代码:
public ArrayList<SongInfoModel> getRecentlyPlayed(){
ArrayList<SongInfoModel> rpList = new ArrayList<>();
String selectQuery = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery,null);
if(cursor.moveToFirst()){
do{
long id = cursor.getLong(0);
String SongName = cursor.getString(1);
String artistName = cursor.getString(2);
long dur = cursor.getLong(3);
String Art = cursor.getString(4);
SongInfoModel sh = new SongInfoModel(id,SongName,artistName,dur,null,Art);
rpList.add(sh);
}while (cursor.moveToNext());
}
return rpList;添加数据的代码:
public void addSong(SongInfoModel songInfoModel){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ID, songInfoModel.getSongID());
values.put(KEY_NAME, songInfoModel.getSongName());
values.put(KEY_ARTIST, songInfoModel.getArtistName());
values.put(KEY_DURATION, songInfoModel.getDuration());
values.put(KEY_ART, songInfoModel.getAlbumIDArtwork());
db.insert(TABLE_NAME,null,values);
db.close();
}发布于 2017-12-22 15:40:13
在create query ")";中更改表查询的尾部分号
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME+ "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_NAME + " TEXT,"
+ KEY_ARTIST + " TEXT,"
+ KEY_DURATION + " INTEGER,"
+ KEY_ART + " TEXT"
+ ")";
sqLiteDatabase.execSQL(CREATE_TABLE);发布于 2017-12-22 15:59:28
我想到的是添加一个表示播放次数的字段,比方说KEY_TIMES。
添加歌曲时检查
最后,为了获得值,只需使用相同的查询,但按这个新字段排序:
String selectQuery = "SELECT * FROM " + TABLE_NAME + " ORDER BY " + KEY_TIMES;要创建表,请使用以下命令:
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String CREATE_TABLE =
"CREATE TABLE " + TABLE_NAME+ "(" +
KEY_ID + " INTEGER PRIMARY KEY," +
KEY_NAME + " TEXT," +
KEY_ARTIST + " TEXT," +
KEY_DURATION + " INTEGER," +
KEY_LAST_PLAYED + " INTEGER," +
KEY_TIMES + " INTEGER," +
KEY_ART + " TEXT" + ");";
sqLiteDatabase.execSQL(CREATE_TABLE);
}然后,当您要添加歌曲时,使用您要添加的ID进行查询,如果查询返回表中的条目,则进行查询以更新KEY_TIMES字段。如果它没有返回条目,请像现在这样插入,但要添加新字段。(目前无法为此提供代码)
发布于 2017-12-22 16:41:54
您可以做的是在代码中添加一个lastPlayed日期字段。所以它看起来像这样。
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String CREATE_TABLE =
"CREATE TABLE " + TABLE_NAME+ "(" +
KEY_ID + " INTEGER PRIMARY KEY," +
KEY_NAME + " TEXT," +
KEY_ARTIST + " TEXT," +
KEY_DURATION + " INTEGER," +
KEY_LAST_PLAYED + " INTEGER," +
KEY_ART + " TEXT" + ");";
sqLiteDatabase.execSQL(CREATE_TABLE);
}您用于显示数据的代码将如下所示,并确保按上次播放的时间排序:
public ArrayList<SongInfoModel getRecentlyPlayed() {
ArrayList<SongInfoModel> rpList = new ArrayList<>();
String selectQuery = "SELECT * FROM " + TABLE_NAME + " ORDER BY " + KEY_LAST_PLAYED + " ASC;";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery,null);
if(cursor.moveToFirst()){
do{
long id = cursor.getLong(0);
String SongName = cursor.getString(1);
String artistName = cursor.getString(2);
long dur = cursor.getLong(3);
String Art = cursor.getString(5);
SongInfoModel sh = new SongInfoModel(id,SongName,artistName,dur,null,Art);
rpList.add(sh);
}while (cursor.moveToNext());
}
return rpList;
}以及用于添加数据的代码:
public void addSong(SongInfoModel songInfoModel){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ID, songInfoModel.getSongID());
values.put(KEY_NAME, songInfoModel.getSongName());
values.put(KEY_ARTIST, songInfoModel.getArtistName());
values.put(KEY_DURATION, songInfoModel.getDuration());
values.put(KEY_LAST_PLAYED, new Date().getTime());
values.put(KEY_ART, songInfoModel.getAlbumIDArtwork());
db.insert(TABLE_NAME,null,values);
db.close();
}此组合将按上次播放的顺序获取数据。
https://stackoverflow.com/questions/47937575
复制相似问题