Compare commits

..

2 commits

Author SHA1 Message Date
avi
bf9222ab0d fix(playlists): re-adding a song to a playlist crashed with SQLiteConstraintException
(playlistId, songId) is the playlist_songs PK, so a second @Insert of the
same pair threw UNIQUE constraint failed and killed the app (reproduced
twice in the crash buffer on 10-03). Switch to OnConflictStrategy.IGNORE:
duplicate add is now a silent no-op. Verified on-device on 0.1.5 (7):
re-adding 'The Humbling River' to FAVORITES keeps the song list intact,
0 FATALs, no new crash-buffer entries.
2026-10-03 19:43:44 -05:00
avi
d0c5ce86fd chore(release): v0.1.4 (versionCode 6) — re-cut of 80b0300 code
v0.1.3 was sideloaded to the test phone during verification before the
release was published, so self-update from that phone saw equal versions
and reported 'up to date'. Release number moved ahead of the installed
build so the update path has something to offer.
2026-10-01 20:09:52 -05:00
2 changed files with 6 additions and 3 deletions

View file

@ -15,8 +15,8 @@ android {
applicationId = "com.rada" applicationId = "com.rada"
minSdk = 26 minSdk = 26
targetSdk = 35 targetSdk = 35
versionCode = 5 versionCode = 7
versionName = "0.1.3" versionName = "0.1.5"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }

View file

@ -3,6 +3,7 @@ package com.rada.data.local.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Delete import androidx.room.Delete
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query import androidx.room.Query
import com.rada.data.local.entity.PlaylistEntity import com.rada.data.local.entity.PlaylistEntity
import com.rada.data.local.entity.PlaylistSongEntity import com.rada.data.local.entity.PlaylistSongEntity
@ -30,7 +31,9 @@ interface PlaylistDao {
@Query("DELETE FROM playlists WHERE id = :playlistId") @Query("DELETE FROM playlists WHERE id = :playlistId")
suspend fun deletePlaylistById(playlistId: Long) suspend fun deletePlaylistById(playlistId: Long)
@Insert // IGNORE: (playlistId, songId) is the PK — re-adding a song that is
// already in the playlist must be a no-op, not a crash.
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun addSongToPlaylist(playlistSong: PlaylistSongEntity) suspend fun addSongToPlaylist(playlistSong: PlaylistSongEntity)
@Query("DELETE FROM playlist_songs WHERE playlistId = :playlistId AND songId = :songId") @Query("DELETE FROM playlist_songs WHERE playlistId = :playlistId AND songId = :songId")