Android 将数据插入表中,如果已经存在,则将其放入顶部SQLite

Android 将数据插入表中,如果已经存在,则将其放入顶部SQLite,android,sqlite,audio,android-music-player,Android,Sqlite,Audio,Android Music Player,我正在我的音乐应用程序中制作“最近播放的”播放列表。我已经创建了一个数据库来存储与歌曲相关的信息。我当前的代码所做的是,每当我播放一首歌时,它就会将它添加到数据库中,并且我可以成功地显示它。但问题是当我播放同一首歌两次时,数据库没有更新。 例如,我分别播放了歌曲A、歌曲B、歌曲C和歌曲D。然后它将显示歌曲A、歌曲B、歌曲C、歌曲D。但如果我再次分别播放歌曲A、歌曲B、歌曲C、歌曲D和歌曲B。然后它再次显示相同的内容(歌曲A、歌曲B、歌曲C、歌曲D)。但我想要的是:歌曲A、歌曲C、歌曲D、歌曲B。

我正在我的音乐应用程序中制作“最近播放的”播放列表。我已经创建了一个数据库来存储与歌曲相关的信息。我当前的代码所做的是,每当我播放一首歌时,它就会将它添加到数据库中,并且我可以成功地显示它。但问题是当我播放同一首歌两次时,数据库没有更新。 例如,我分别播放了歌曲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;

在“创建查询”中更改表查询的尾随分号“

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

我想到的是添加一个字段,指示播放的次数,比如按键次数

添加歌曲检查时

  • 如果已经存在,则更新字段
  • 如果没有,则将其与默认值的字段一起添加
最后,要获取值,只需使用相同的查询,但按此新字段排序:

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字段。如果它不返回条目,请按现在的方式插入,但添加新字段。(目前无法提供此代码)

您可以在代码中添加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;
}

此组合将按上次播放的顺序获取数据。

没有区别,是相同的。尝试此集合。反转(您的列表);您有一个字符串数组中的歌曲列表,然后是在
媒体播放器中播放的歌曲列表
。制作另一个列表并将其添加到.values.put(按上次播放,新日期().getTime());它是android中的内置类吗?new Date()??我认为它是一个Java类,所以它应该存在,不需要为它带来新的库。该命令的作用是根据本地设备时钟以毫秒为单位表示当前时间和日期。顺便说一句,我在手机上键入了此命令,因此无法确保没有错误。如果顺序颠倒,请尝试按部分顺序中的DSC而不是ASC。这给了我一个错误:不存在列键\u LAST\u PLAYED
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();
}