Сохранение данных в Realm
Начал осваивать Realm и столкнулся со следующей проблемой. Запрашиваю данные и сохраняю их, а потом пытаюсь их отобразить. Не получается правильно сохранить массив данных в БД, чтобы в дальнейшем из него брать данные для отображения. Полностью страница кода выглядит следующим образом:
class MainActivity : AppCompatActivity() {
var request: Disposable? = null
override fun onCreate(savedInstanceState: Bundle?) {
Realm.init(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val o = createRequest().map { Gson().fromJson(it, FeedAPI::class.java) }
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
request = o.subscribe({
val feed = Feed(
it.top.mapTo(
RealmList<FeedItem>(),
{ feed -> FeedItem(feed.game, feed.channels, feed.viewers) })
)
Realm.getDefaultInstance().executeTransaction { realm ->
val oldList = realm.where(Feed::class.java).findAll()
if (oldList.size > 0)
for (item in oldList)
item.deleteFromRealm()
realm.copyToRealm(feed)
}
showNewsRecView()
for (item in it.top)
Log.d(
"M_MainActivity",
"game= ${item.game.name} " + "logo = ${item.game.logo.large}" + "channels = ${item.channels} " + "viewers = ${item.viewers} "
)
}, {
Log.d("M_MainActivity", "", it)
showNewsRecView()
})
}
fun showNewsRecView() {
Realm.getDefaultInstance().executeTransaction { realm ->
val feed = realm.where(Feed::class.java).findAll()
if (feed.size > 0) {
act1_recView.adapter = RecAdapter(feed[0]!!.top)
act1_recView.layoutManager = LinearLayoutManager(this)
}
}
}
}
class FeedAPI(
val top: ArrayList<FeedItemAPI>
)
class FeedItemAPI(
val game: FeedGameAPI,
val channels: String,
val viewers: String
)
class FeedGameAPI(
val name: String,
val logo: FeedLogoAPI
)
class FeedLogoAPI(
val large: String
)
open class Feed(
var top: RealmList<FeedItem> = RealmList<FeedItem>()
) : RealmObject()
open class FeedItem(
var game: FeedGame? = null,
var channels: String = "",
var viewers: String = ""
) : RealmObject()
open class FeedGame(
var name: String = "",
var logo: FeedLogo? = null
) : RealmObject()
open class FeedLogo(
var large: String = ""
) : RealmObject()
class RecAdapter(private val top: RealmList<FeedItem>) : RecyclerView.Adapter<RecViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecViewHolder {
val inflater = LayoutInflater.from(parent.context)
val view = inflater.inflate(R.layout.item_list, parent, false)
return RecViewHolder(view)
}
override fun getItemCount(): Int {
return top.size
}
override fun onBindViewHolder(holder: RecViewHolder, position: Int) {
val item = top[position]!!
holder.bind(item)
}
}
class RecViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(top: FeedItem) {
val vChannels = itemView.findViewById<TextView>(R.id.item_channels)
val vViewers = itemView.findViewById<TextView>(R.id.item_viewers)
val vLogo = itemView.findViewById<ImageView>(R.id.item_thumb)
val vName = itemView.findViewById<TextView>(R.id.item_name)
vName.text = top.game?.name
vChannels.text = top.channels + "chanels"
vViewers.text = top.viewers + "Viewers"
Picasso.get().load(top.game?.logo?.large).into(vLogo)
}
}
ошибка возникает в этом моменте:
val feed = Feed(
it.top.mapTo(
RealmList<FeedItem>(),
{ feed -> FeedItem(feed.game, feed.channels, feed.viewers) })
)
feed.game подчеркивается красным. Текст ошибки следующий : Type mismatch: inferred type is FeedGameAPI but FeedGame? was expected.
Природу ошибки я понимаю, но не знаю, как именно нужно исправить мой код, чтобы происходило корректное сохранение полученных данных и их дальнейшее использование. Прошу подскажите, кто может.
P.S Ответ приходит в подобном виде:
{
"_total": 1157,
"top": [
{
"channels": 953,
"viewers": 171708,
"game": {
"_id": 32399,
"box": {
"large": "https://static-cdn.jtvnw.net/ttv-boxart/Counter-Strike:%20Global%20Offensive-272x380.jpg",
"medium": "https://static-cdn.jtvnw.net/ttv-boxart/Counter-Strike:%20Global%20Offensive-136x190.jpg",
"small": "https://static-cdn.jtvnw.net/ttv-boxart/Counter-Strike:%20Global%20Offensive-52x72.jpg",
"template": "https://static-cdn.jtvnw.net/ttv-boxart/Counter-Strike:%20Global%20Offensive-{width}x{height}.jpg"
},
"giantbomb_id": 36113,
"logo": {
"large": "https://static-cdn.jtvnw.net/ttv-logoart/Counter-Strike:%20Global%20Offensive-240x144.jpg",
"medium": "https://static-cdn.jtvnw.net/ttv-logoart/Counter-Strike:%20Global%20Offensive-120x72.jpg",
"small": "https://static-cdn.jtvnw.net/ttv-logoart/Counter-Strike:%20Global%20Offensive-60x36.jpg",
"template": "https://static-cdn.jtvnw.net/ttv-logoart/Counter-Strike:%20Global%20Offensive-{width}x{height}.jpg"
},
"name": "Counter-Strike: Global Offensive",
"popularity": 170487
}
},
...
]
}