将数据插入表中,如果已经存在,则将其带到顶级SQLite

问题描述 投票:2回答:3

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

    }
android sqlite audio android-music-player
3个回答
0
投票

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

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

0
投票

您可以做的是在代码中添加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();
}

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


0
投票

我想到的是添加一个表示播放次数的字段,比如说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字段。如果它没有返回条目,请在您现在正在进行插入时进行插入,但添加新字段。 (现在无法提供此代码)

© www.soinside.com 2019 - 2024. All rights reserved.