Вставьте данные в таблицу и, если они уже есть, перенесите их на верх 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();
}
Эта комбинация позволит вам получить данные в порядке последней игры.