我对API响应有以下模型:
本地数据源
所有其他字段都正常工作,但是
我已经尝试将其默认值更改为
@Entity(tableName = TABLE_NAME)
class WeatherEntry {
@PrimaryKey(autoGenerate = true)
var wID: Long? = null
@SerializedName("dt")
@ColumnInfo(name = COLUMN_DATE)
var date: String = ""
@SerializedName("city")
@Embedded(prefix = "location_")
var location: Location? = null
@SerializedName("main")
@Embedded(prefix = "main_")
var main: Main? = null
@SerializedName("weather")
@TypeConverters(Converters::class)
@Embedded(prefix = "weather_")
var weather: ArrayList<Weather>? = null
@SerializedName("wind")
@Embedded(prefix = "wind_")
var wind: Wind? = null
}
天气报告
从本地或远程数据源获取数据,我将forceRemote
设置为true
,否则一开始就不会显示任何数据。
class WeatherRepository @Inject constructor(@Local var localDataSource: WeatherDataSource, @Remote var remoteDataSource: WeatherDataSource) :
WeatherDataSource {
private var caches: MutableList<WeatherEntry> = mutableListOf()
override fun getWeatherEntries(location: String, forceRemote: Boolean): Flowable<MutableList<WeatherEntry>> {
if (forceRemote) {
return refreshData(location)
} else {
return if (caches.isNotEmpty()) {
// if cache is available, return it immediately
Flowable.just(caches)
} else {
// else return data from local storage
localDataSource.getWeatherEntries(location, false)
.take(1)
.flatMap(({ Flowable.fromIterable(it) }))
.doOnNext { question -> caches.add(question) }
.toList()
.toFlowable()
.filter({ list -> !list.isEmpty() })
.switchIfEmpty(refreshData(location)) // If local data is empty, fetch from remote source instead.
}
}
}
/**
* Fetches data from remote source.
* Save it into both local database and cache.
*
* @return the Flowable of newly fetched data.
*/
private fun refreshData(location: String): Flowable<MutableList<WeatherEntry>> {
return remoteDataSource.getWeatherEntries(location,true).doOnNext({
// Clear cache
caches.clear()
// Clear data in local storage
localDataSource.deleteAllWeatherEntries()
}).flatMap(({ Flowable.fromIterable(it) })).doOnNext({ entry ->
caches.add(entry)
localDataSource.insertWeatherEntry(entry)
}).toList().toFlowable()
}
本地数据源
class WeatherLocalDataSource @Inject constructor(private var weatherDao: WeatherDao): WeatherDataSource {
override fun insertWeatherEntry(weatherEntry: WeatherEntry) {
return weatherDao.insert(weatherEntry)
}
...
}
远程数据源 这个肯定有效,因为我从API中获取了所有信息。
class WeatherRemoteDataSource @Inject constructor(var weatherService: WeatherService) :
WeatherDataSource {
override fun getWeatherEntries(location: String, forceRemote: Boolean): Flowable<MutableList<WeatherEntry>> {
return weatherService.getForecast(
location,
"json",
"metric",
BuildConfig.OPEN_WEATHER_MAP_API_KEY
).map(WeatherForecastResponse::weatherEntries)
}
}
DAO
@Dao
interface WeatherDao {
...
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(weatherEntry: WeatherEntry)
}
数据库
@Database(
entities = [(WeatherEntry::class)],
version = 1
)
abstract class WeatherDatabase : RoomDatabase() {
abstract fun weatherDao(): WeatherDao
}
所有其他字段都正常工作,但是
wID
始终为null。我的实现有什么问题吗?我已经尝试将其默认值更改为
0
并将类型更改为Int,但也不起作用。