Я хочу выбрать данные из базы данных через комнату.
Вот мой код.
База данных
@Database(entities = [TicketDb::class], version = 1)
@TypeConverters(DatabaseConverters::class)
abstract class MyDatabase : RoomDatabase() {
abstract fun ticketDbDao(): TicketDbDao
companion object {
@Volatile
private var INSTANCE: MyDatabase? = null
fun getDatabase(context: Context, scope: CoroutineScope): MyDatabase {
val tempInstance = INSTANCE
if (tempInstance != null) {
return tempInstance
}
synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
MyDatabase::class.java,
"my_database"
)
.build()
INSTANCE = instance
return instance
}
}
}
}
Класс данных
@Entity(tableName = "ticket_table")
data class TicketDb (@ColumnInfo(name = "ticketnumber") var ticketnumber: String = "1234567") {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id") var id: Int = 0
}
Дао
@Dao
interface TicketDbDao {
@Insert
suspend fun insert(ticket: TicketDb)
@Query("SELECT * FROM ticket_table ORDER BY id DESC")
fun getAllTickets(): LiveData<List<TicketDb>>
}
Репозиторий
class TicketRepository (private val ticketDbDao: TicketDbDao) {
val allTickets: LiveData<List<TicketDb>> = ticketDbDao.getAllTickets()
@WorkerThread
suspend fun insert(ticket: TicketDb) {
ticketDbDao.insert(ticket)
}
}
Viewmodel
var ticketRepository: TicketRepository
val allTickets: LiveData<List<TicketDb>>
init {
val ticketDao = MeinLottoDatabase.getDatabase(application, viewModelScope).ticketDbDao()
ticketRepository = TicketRepository(ticketDao)
allTickets = ticketRepository.allTickets
}
fun saveTicket() = viewModelScope.launch(Dispatchers.IO) {
ticketRepository.insert(ticket.value!!.toTicketDb())
}
Метод saveTicket работает.Я скачал базу данных и все сохраненные записи присутствуют.Но всякий раз, когда я вызываю ticketRepository.allTickets, я получаю пустой список обратно.
Я установил точку останова в автоматически сгенерированном классе TicketDbDao_Impl в методе вызова в объекте Callable, но точка останова никогда не достигается.
@Override
public LiveData<List<TicketDb>> getAllTickets() {
final String _sql = "SELECT * FROM ticket_table";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
return __db.getInvalidationTracker().createLiveData(new String[]{"ticket_table"}, false, new Callable<List<TicketDb>>() {
@Override
public List<TicketDb> call() throws Exception {
final Cursor _cursor = DBUtil.query(__db, _statement, false);
try {
// BREAKPOINT here
final int _cursorIndexOfId = CursorUtil.getColumnIndexOrThrow(_cursor, "id");
final int _cursorIndexOfName = CursorUtil.getColumnIndexOrThrow(_cursor, "name");