Android Studio Room: ошибка при получении значения из ArrayList

#android

#Android

Вопрос:

У меня есть база данных, в которой я сохраняю объект, а внутри нее есть ArrayList другого объекта. Это сохраняет perfect, и я также получаю их из perfect database. Проблема в том, что если я печатаю идентификатор сеанса (класс сеансов), он печатает его хорошо (например: Log.d («test», sessions.id )) но если я хочу напечатать имя продукта (в классе SessionProduct) этого сеанса (например: Log.d («test», session.sessionProducts[0].name), он возвращает «NullPointer») API возвращает ну, я не знаю, проблема в том, как я его сохраняю, или в том, как я его здесь устанавливаю:

 @Entity
data class Sessions (
    @PrimaryKey
    @NonNull
    @SerializedName("id") var id: String,
    @Embedded
    @SerializedName("items") var sessionProducts: ArrayList<SessionProduct>? = ArrayList() // El problema esta aca
) : Serializable
  

И sessionProducts:

 @Entity
data class SessionProduct (
    @PrimaryKey
    @SerializedName("id") var id: String,
    @SerializedName("name") var name: String
) : Serializable
  

(Я вырезал два класса, чтобы он был не таким обширным)

Я использовал либо TypeConverter, либо нет, и в обоих случаях он также выдавал NullPointer

 @Database(entities = [Sessions::class, SessionProduct::class], version = 4, exportSchema = false)
@TypeConverters(SessionsProductsConverter::class)
abstract class AppDatabase : RoomDatabase(){
  

Я повторяю: Проблема в том, что я хочу получить то, что находится внутри ArrayList

 @Dao
interface PendingSessionsDao {

    @Query("SELECT * FROM sessions")
    fun getAllPendingSessions(): List<Sessions>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun addAllPendingSessions(sessions: List<Sessions>)

    @Update
    fun updatePendingSessions(sessions: List<Sessions>)

    @Query("DELETE FROM sessions")
    fun deleteAllTable()

}
  

Это функция, в которой я сохраняю

 fun addPendingSessions(context: Context, sessions: List<Sessions>){

        class AddPendingSessions : AsyncTask<Void, Void, Void>(){
            override fun doInBackground(vararg params: Void?): Void? {
                AppDatabase.getPendingSessionsDatabaseInstance(context).pendingSessionsDao().addAllPendingSessions(sessions)
                return null
            }

            override fun onPostExecute(result: Void?) {
                super.onPostExecute(result)
                Toast.makeText(context, "Pending sessions saved!", Toast.LENGTH_SHORT).show()

            }
        }
        AddPendingSessions().execute()
    }
  

И для тестирования я делаю это:

 Log.d("TestingPicking", sessionId.id) // This prints well on the console

for (product in sessionId.sessionProducts!!) // this throw NullPointer
    Log.d("TestingPicking", product.name) // this throw NullPointer
  

Я перепробовал все, что видел в Интернете, и не смог сделать это правильно. Возможно, у кого-то еще такая же проблема, и он знает, как ее исправить. Большое вам спасибо!

Ответ №1:

Попробуйте удалить @Embedded из sessionProducts в классе данных Sessions

Редактировать

Вам нужен преобразователь типов, см.https://medium.com/@toddcookevt/android-room-storing-lists-of-objects-766cca57e3f9