#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