【问题标题】:Insert data into table and if already present bring it to the top SQLite将数据插入表中,如果已经存在,将其带到顶部 SQLite
【发布时间】:2017-12-22 07:38:22
【问题描述】:

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

    }

【问题讨论】:

  • 试试这个 Collections.reverse(yourList);
  • 你有一个在字符串数组中的歌曲列表然后你在media player播放。创建另一个列表并将其添加到。

标签: android sqlite audio android-music-player


【解决方案1】:

在创建查询 ")";

中更改您的表查询尾随分号
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);

【讨论】:

  • 没有区别,都是一样的。
【解决方案2】:

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

此组合将按照上次播放的顺序为您提供数据。

【讨论】:

  • values.put(KEY_LAST_PLAYED, new Date().getTime());它是android中的内置类吗?新日期()??
  • 我认为它是一个 Java 类
  • 所以它应该存在,不需要为它带来新的库。该命令的作用是根据本地设备时钟为您提供以毫秒为单位的当前时间和日期。
  • 顺便说一句,我是在手机上输入的,所以我无法确保没有错误。如果顺序颠倒了,请尝试在 Order by 部分中使用 DSC 而不是 ASC。
  • 它给了我一个错误:没有列存在KEY_LAST_PLAYED
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多