Вставьте данные в таблицу и, если они уже есть, перенесите их на верх SQLite.

Я делаю плейлист "Недавно воспроизведенный" в моем музыкальном приложении. Я создал базу данных для хранения информации, связанной с песнями. То, что делает мой текущий код, всякий раз, когда я играю песню, она добавляет ее в базу данных, и я могу ее успешно отобразить. Но проблема в том, что когда я играю одну и ту же песню дважды, база данных не обновляется. Например, я проиграл песню 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();

    }

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

И затем, когда вы собираетесь добавить песню, сделайте запрос с идентификатором, который вы хотите добавить, если запрос возвращает запись в таблице, сделайте запрос для обновления поля KEY_TIMES. Если он не возвращает запись, сделайте вставку, как вы делаете это прямо сейчас, но добавив новое поле. (Не могу предоставить код для этого прямо сейчас)

Измените точку с запятой в конце запроса таблицы внутри запроса create ")";

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

Что вы можете сделать, это добавить поле даты 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();
}

Эта комбинация позволит вам получить данные в порядке последней игры.

Другие вопросы по тегам