[英]Android Room - Inserting works but select doesn´t return any values
我想通過房間從數據庫中選擇數據。
這是我的代碼。
數據庫
@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)
}
}
視圖模型
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 時,我都會得到一個空列表。
我在 Callable 對象的 call-method 中的自動生成類 TicketDbDao_Impl 中設置了一個斷點,但從未達到該斷點。
@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");
我認為您在從房間檢索數據時遇到了問題。 以下代碼未經測試,但為了指導您,我正在嘗試解決。 檢查並在評論中回復它是否有效。
@Dao
interface TicketDbDao {
@Insert
suspend fun insert(ticket: TicketDb)
@Query("SELECT * FROM ticket_table ORDER BY id DESC")
fun getAllTickets(): LiveData<List<TicketDb>>
}
我認為房間查詢返回列表數據,但您正在嘗試獲取 livedata 對象。 所以改為下面的dao操作代碼。
@Dao
interface TicketDbDao {
@Insert
suspend fun insert(ticket: TicketDb)
@Query("SELECT * FROM ticket_table ORDER BY id DESC")
fun getAllTickets(): List<TicketDb>
}
票務庫
class TicketRepository (private val ticketDbDao: TicketDbDao) {
val allTickets: List<TicketDb>
get() = ticketDbDao.getAllTickets()
@WorkerThread
suspend fun insert(ticket: TicketDb) {
ticketDbDao.insert(ticket)
}
}
現在在您的視圖模型中
var ticketRepository: TicketRepository
private val _allTickets = MutableLiveData<List<TicketDb>>() // backing property should be used for updating values
val allTickets: LiveData<List<TicketDb>> = _allTickets // mutable live data should not be exposed
init {
val ticketDao = MeinLottoDatabase.getDatabase(application, viewModelScope).ticketDbDao()
ticketRepository = TicketRepository(ticketDao)
}
fun getTicketValues(){
_allTickets.value = ticketRepository.allTickets
}
fun saveTicket() = viewModelScope.launch(Dispatchers.IO) {
ticketRepository.insert(ticket.value!!.toTicketDb())
}
你必須觀察你的activity或者fragment中的livedata,比如
ViewModel.allTickets.observe(this, new Observer<>() {
@Override
public void onChanged() {
}
});
我已經嘗試了相同的代碼,但幾乎沒有什么變化,對我來說效果很好
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val ticket1 = TicketDb("1")
val ticket2 = TicketDb("12")
val ticket3 = TicketDb("1123")
val ticket4 = TicketDb("4214")
MyDatabase.getDatabase(applicationContext).ticketDbDao()?.run {
insert(ticket1)
insert(ticket2)
insert(ticket3)
insert(ticket4)
}
val data = MyDatabase.getDatabase(applicationContext).ticketDbDao().getAllTickets()
Log.i("Hardik", "Data :$data")
}
}
我的數據庫
@Database(entities = [TicketDb::class], version = 1)
abstract class MyDatabase : RoomDatabase() {
abstract fun ticketDbDao(): TicketDbDao
companion object {
@Volatile
private var INSTANCE: MyDatabase? = null
fun getDatabase(context: Context): MyDatabase {
val tempInstance = INSTANCE
if (tempInstance != null) {
return tempInstance
}
synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
MyDatabase::class.java,
"my_database"
).allowMainThreadQueries().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
}
TicketDbDao @Dao 接口 TicketDbDao {
@Insert
fun insert(ticket: TicketDb)
@Query("SELECT * FROM ticket_table ORDER BY id DESC")
fun getAllTickets(): List<TicketDb>
}
這給了我在日志中插入的數據,如下所示
2019-07-12 15:48:51.179 30262-30262/com.hardik.demos I/Hardik: Data :[TicketDb(ticketnumber=4214), TicketDb(ticketnumber=1123), TicketDb(ticketnumber=12), TicketDb(ticketnumber=1), TicketDb(ticketnumber=4214), TicketDb(ticketnumber=1123), TicketDb(ticketnumber=12), TicketDb(ticketnumber=1), TicketDb(ticketnumber=1), TicketDb(ticketnumber=1), TicketDb(ticketnumber=1)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.