Комната не вставляет данные в БД - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу вставить некоторые данные в мою БД в Android Room.Проблема в том, что каждый раз, когда я запрашиваю свои данные, результат равен нулю.

Это код моей базы данных:

@Database(entities = [VenueResult::class, VenueDetailResult::class], version = 1, exportSchema = false)
abstract class VenueFinderDatabase: RoomDatabase() {

abstract fun venueResultsDao(): VenueResultsDao
abstract fun venueDetailDao(): VenueDetailDao

companion object {
    private var instance: VenueFinderDatabase? = null

    fun getInstance(context: Context) : VenueFinderDatabase {
        instance?.let {
            return it
        } ?: run {
            synchronized(VenueFinderDatabase::class) {
                Room.databaseBuilder(context.applicationContext,
                    VenueFinderDatabase::class.java, "venuefinder.db")
                    .build().let {
                        return it
                    }
            }
        }
     }
  }
}

Это мой Дао:

@Dao
interface VenueResultsDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(venueResult: VenueResult): Long

@Query("SELECT * FROM venueResult WHERE requestId = :requestId")
fun getVenueResultsForRequestId(requestId: String): LiveData<List<VenueResult>>

@Query("SELECT * FROM VenueResult WHERE search_value = :value")
fun getVenueResultsForSearchValue(value: String): LiveData<List<VenueResult>>
}

Это моя сущность:

@Entity
data class VenueResult(
   @PrimaryKey val id: String,
   @ColumnInfo(name = "requestId") val requestId: String,
   @ColumnInfo(name = "name") val name: String,
   @ColumnInfo(name = "location_cc") val locationCC: String?,
   @ColumnInfo(name = "location_city") val locationCity: String?,
   @ColumnInfo(name = "location_state") val locationState: String?,
   @ColumnInfo(name = "search_value") val searchValue: String
)

А это мой инструментированный тест:

@RunWith(AndroidJUnit4::class)
class VenueFinderDatabaseInstrumentedTest {
private lateinit var database: VenueFinderDatabase
private lateinit var venueResultsDao: VenueResultsDao

@Before
fun setup() {
    val context = ApplicationProvider.getApplicationContext<Context>()
    database = Room.inMemoryDatabaseBuilder(
        context, VenueFinderDatabase::class.java
    ).build()
    venueResultsDao = database.venueResultsDao()
}

@After
fun tearDown() {
    database.clearAllTables()
    database.close()
}

@Test
fun validateIfDataIsInsertedInDatabase() {
    // Arrange
    val searchValue = "New York"
    val venueResult = getDummyVenueResult(searchValue)

    // Act
    venueResultsDao.insert(venueResult)
    val result = venueResultsDao.getVenueResultsForSearchValue(searchValue).value?.first()

    // Assert
    assertNotNull(result)
    //assertEquals(venueResult, result)
}

private fun getDummyVenueResult(value: String) =
    VenueResult(
        id = "5642aef9498e51025cf4a7a5",
        requestId = "59a45921351e3d43b07028b5",
        name = "Mr. Purple",
        locationCC = "US",
        locationCity = "New York",
        locationState = "NY",
        searchValue = value
    )
}

Может кто-нибудь указать мне, что я делаю не так?Почему мой результат нулевой и как я могу это исправить?

1 Ответ

0 голосов
/ 16 февраля 2019

Может кто-нибудь указать мне, что я делаю не так?

Вы звоните getVenueResultsForSearchValue().Это возвращает LiveData<List<VenueResult>>.Я не делаю ваш запрос.Это настройка LiveData, которая будет выполнять ваш запрос, когда что-то наблюдает за ним.Итак, когда вы достигнете LiveData, чтобы получить значение, оно будет null.

как я могу это исправить?

Либо:

...