Ich habe ein Problem mit meinem Code und kann es nicht lösen. Lassen Sie uns nur kurz erläutern, was ich tun werde: Ich habe eine Adresse im ChooseFragment und es gibt eine Schaltfläche zum Bearbeiten der Adresse. ok soweit gut Mit dem Bearbeitungsklick wird eine neue Adresse an den DatabaseRoom übergeben und der Adresstext wird geändert. Dies geschieht jedoch nur zum ersten Mal. die zweite Zeit die Adresse nicht geändert !! . Ich weiß, dass die Einfügemethode funktioniert und die neuen Daten an den Datenbankraum sendet, aber wenn ich sie mit meiner Abfrage (SELECT * FROM ...) erhalten möchte, zeige einfach den ersten Parameter und ersetze ihn nicht durch einen neuen Wert. Was ist los mit meinen Codes?

Das ist mein Tisch:

@Entity (tableName = "addresstable")
data class AddressTb(

    @PrimaryKey(autoGenerate = true)```
    val id : Int? ,
    var address: String)```

Das ist meine Datenbank:

@Database(entities = [RoomTables::class , AddressTb::class], version = 1, exportSchema = false)


abstract class DataBaseRoom : RoomDatabase() {

    abstract fun GetDao(): DaoCart


    companion object {
        @Volatile
        private var instance: DataBaseRoom? = null

        private val lock = Any()

        operator fun invoke(context: Context) = instance
            ?: synchronized(lock) {
                instance
                    ?: makeDatabase(
                        context
                    ).also {
                        instance = it
                    }
            }

        private fun makeDatabase(context: Context) = Room.databaseBuilder(
            context.applicationContext,
            DataBaseRoom::class.java,
            "name"
        ).build()
    }

}```
this is my Dao : 
```//address table dao

        @Query("SELECT * FROM addresstable")
        fun getalladress () : LiveData<AddressTb>


        @Insert(onConflict = OnConflictStrategy.REPLACE)
        suspend fun insertaddress (model : AddressTb)


        @Query("DELETE FROM addresstable")
       suspend fun deleteaddress ()

Das ist mein Repository:


    fun getalladdress() = db.GetDao().getalladress()

    suspend fun deleteaddress() = db.GetDao().deleteaddress()

    suspend fun insertaddress(model : AddressTb) = db.GetDao().insertaddress(model)

Das ist mein Viewmodel:



    fun getaddress() = repository.getalladdress()


    fun deleteaddres() = CoroutineScope(Dispatchers.Default).launch {


        repository.deleteaddress()

    }


    fun insertaddress(model : AddressTb) = CoroutineScope(Dispatchers.Default).launch {


        repository.insertaddress(model)

Dies ist mein Fragment, in dem ich die neue Beilage hole:

class ChosseAddress : Fragment() {


    lateinit var viewModelRoom: ViewModelRoom

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {


        val vl = inflater.inflate(R.layout.choose_address_layout, container, false)


        val database = DataBaseRoom(requireContext())
        val repository = RepositoryCart(database)
        val factoryRoom = FactoryRoom(repository)


        viewModelRoom =
            ViewModelProvider(ViewModelStoreOwner { ViewModelStore() }, factoryRoom).get(
                ViewModelRoom::class.java
            )
        viewModelRoom.getaddress().observe(viewLifecycleOwner, Observer {


            try {

                vl.txt_address.text = it.address


            } catch (ex: Exception) {
                null
            }

        })



        val animsec: Animation =
            AnimationUtils.loadAnimation(vl.context, R.anim.anim_for_btn_zoom_out)

        vl.button_back_choose_address.setOnClickListener {

            it.startAnimation(animsec)


            childFragmentManager.beginTransaction()
                .replace(R.id.choose_address_container, HamburgerFragment())
                .commit()

        }

        vl.edit_address.setOnClickListener {


            val mycustomview =
                LayoutInflater.from(context).inflate(R.layout.alertfialog_costume, null)
            val dialogtext = LayoutInflater.from(context).inflate(R.layout.edit_alert_txt, null)

            val mBuilder = AlertDialog.Builder(context)
                .setView(mycustomview)
                .setCustomTitle(dialogtext)
            val show = mBuilder.show()

            mycustomview.edit_manually.setOnClickListener {

                show.dismiss()
                childFragmentManager.beginTransaction()
                    .replace(R.id.choose_address_container, ManuallyAddressFragment())
                    .commit()


            }


        }



        return vl


    }


}```

Und hier füge ich Daten in die Datenbank ein:


class ManuallyAddressFragment : Fragment() {

    lateinit var viewmodel: ViewModelRoom

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val layoutview = inflater.inflate(R.layout.manually_address_fragment, container, false)

        val database = DataBaseRoom(layoutview.context)
        val repos = RepositoryCart(database)
        val factory = FactoryRoom(repos)

        viewmodel = ViewModelProvider(ViewModelStoreOwner { viewModelStore },
            factory).get(ViewModelRoom::class.java)


        val btncancle: Button = layoutview.btn_cancle
        val btnsubmit: Button = layoutview.btn_submit_address


        btnsubmit.setOnClickListener {

            val edittext = layoutview.edit_address_manually

            if (edittext.text.toString().isEmpty()) {

                Toast.makeText(context, R.string.submit_btn, Toast.LENGTH_SHORT).show()
            } else {


               val  insert = (AddressTb( null , edittext.text.toString()))
                viewmodel.insertaddress(insert)
                childFragmentManager.beginTransaction()
                    .setCustomAnimations(
                        R.anim.anim_fragment_manually,
                        R.anim.anim_fragment_chooseaddress
                    )
                    .replace(R.id.manually_container, ChosseAddress())
                    .commit()
                Toast.makeText(context, "آدرس شما با موفقیت ثبت شد", Toast.LENGTH_SHORT).show()


            }


        }



        btncancle.setOnClickListener {

            childFragmentManager.beginTransaction()
                .setCustomAnimations(
                    R.anim.anim_fragment_manually,
                    R.anim.anim_fragment_chooseaddress
                )
                .replace(R.id.manually_container, ChosseAddress())
                .commit()

        }



        return layoutview


    }
}```

Ich habe versucht, so dass die Dinge auch Update-Methode verwenden, aber die Datenbank nur den ersten Parameter zurück und ich möchte den neuen Einfügewert ...

0
Bahador Eslami 29 Aug. 2020 im 13:34

2 Antworten

Beste Antwort

Verwenden Sie zum Aktualisieren des Werts dieselbe ID wie in Ihrem Code. Sie sehen, dass Sie versuchen, ein neues Objekt AddressTb (null, edittext.text.toString ()) einzufügen, das Sie null Wert für ID , übergeben Sie dieselbe ID aus dem AddressTb-Objekt, das Sie aktualisieren möchten und die Sie von getalladdress erhalten.

0
TRK P 29 Aug. 2020 im 11:35

Wenn Sie zunächst alle Adressen erhalten, sollte dies folgendermaßen aussehen:

    @Query("SELECT * FROM addresstable")
    fun getalladress () : LiveData<List<AddressTb>>

Verwenden Sie Folgendes, um eine einzelne Adresse auszuwählen:

@Query("SELECT * FROM addresstable WHERE id= :id")
fun findAddressById(id: Long) : AddressTb
0
Gavin Wright 29 Aug. 2020 im 11:15