Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Room database loses data

I'm working on an Android project with Kotlin language and I'm using Room database from android architecture components. These are all my Room database stuff. I'm trying to let the user save information about a book and it works fine while I'm in the app, but when I restart the app, everything has been deleted. I need to store data in memory and because of that I'm using inMemoryDatabaseBuilder but it doesn't seem to work. Any help is appreciated.

Dependencies:

dependencies {
    def room_version = "1.1.1"
    implementation "android.arch.persistence.room:runtime:$room_version"
    kapt "android.arch.persistence.room:compiler:$room_version"
}

apply plugin: 'kotlin-kapt'

Entity:

@Entity(tableName = "tblBooks")
data class BookData(@PrimaryKey(autoGenerate = true) var id: Long?,
                    @ColumnInfo(name = "name") var name: String,
                    @ColumnInfo(name = "author") var author: String,
                    @ColumnInfo(name = "translator") var translator: String,
                    @ColumnInfo(name = "publisher") var publisher: String,
                    @ColumnInfo(name = "publication_year") var publicationYear: Int?,
                    @ColumnInfo(name = "price") var price: Int?,
                    @ColumnInfo(name = "description") var description: String,
                    @ColumnInfo(name = "category") var category: String,
                    @ColumnInfo(name = "shelf_number") var shelfNumber: Int?,
                    @ColumnInfo(name = "front_cover") var frontCover: String?,
                    @ColumnInfo(name = "back_cover") var backCover: String?
){
    constructor():this(null, "", "", "", "", 0, 0, "", "",
            0, "", "")
}

Dao:

@Dao
interface BookDataDao {

    @Query("SELECT * FROM tblBooks")
    fun getAll(): List<BookData>

    @Insert(onConflict = REPLACE)
    fun insert(bookData: BookData)


}

Database:

@Database(entities = [BookData::class], version = 1)
abstract class BookDatabase: RoomDatabase(){

    abstract fun bookDataDao(): BookDataDao

    companion object {
        private var INSTANCE: BookDatabase? = null

        fun getInstance(context: Context): BookDatabase? {
            if (INSTANCE == null){
                synchronized(BookDatabase::class){
                    INSTANCE = 
                    Room.inMemoryDatabaseBuilder(context.applicationContext,
                            BookDatabase::class.java).build()
                }
            }
            return INSTANCE
        }
    }
}

Usage: inserting data:

val database = BookDatabase.getInstance(this) !!
database.bookDataDao().insert(bookData)

retrieving data:

val database = BookDatabase.getInstance(this) !!
val booksList = database.bookDataDao().getAll()
like image 525
Soroush Avatar asked Dec 21 '25 03:12

Soroush


1 Answers

If you are only storing on memory, it is normal your database does not persist between launches of the app. According to the documentation:

Information stored in an in memory database disappears when the process is killed

Meaning everytime you kill the application, the database is closed as well. If you want it to be persistant you should use standard databaseBuilder instead, it will be put on the device storage.

like image 114
Macmist Avatar answered Dec 24 '25 03:12

Macmist



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!