【问题标题】:Kotlin Retrofit Post Request some posted values shows empty result in DatabaseKotlin Retrofit Post Request 一些发布的值在数据库中显示空结果
【发布时间】:2020-11-05 21:22:56
【问题描述】:

所以我有一个 API 端点 (https://someEndpoint.com/someEndpoint/e-member?insert),其主体如下所示,如 Postman 所示:

 {
    "emember_id": "B3456",
    "emember_name": "Darren Kent",
    "emember_gender" : "L",
    "emember_nohp" : "08123456799",
    "emember_email" : "darreen@gmail.com",
    "emember_address" : "Kost Mawar",
    "emember_username" : "Dreen12",
    "emember_password" : "Rahasia123456",
    "emember_dob" : "1996-03-13T00:00:00.000Z",
    "emember_lastupdate" : "0000-00-00T00:00:00.000Z"
}

还有这个改造客户端

    object RetrofitClient {
        private const val BASE_URL = "https://someEndpoint.com/someEndpoint/e-member?insert"

        val instance: API by lazy{
           val retrofit = Retrofit.Builder()
               .baseUrl(BASE_URL)
               .addConverterFactory(GsonConverterFactory.create())
               .build()

           retrofit.create(API::class.java)
       }
   }

带接口:

interface API {
    @POST("e-member?insert")
    fun insertNewMember(@Body postedInformation : RegisterMemberRequestBody): Call<DefaultResponse>
}

这是数据类RegisterMemberRequestBody

@Parcelize
data class RegisterMemberRequestBody(

    @field:SerializedName("emember_id")
    val ememberId: String? = null,

    @field:SerializedName("emember_username")
    val ememberUsername: String? = null,

    @field:SerializedName("emember_gender")
    val ememberGender: String? = null,

    @field:SerializedName("emember_name")
    val ememberName: String? = null,

    @field:SerializedName("emember_password")
    val ememberPassword: String? = null,

    @field:SerializedName("emember_dob")
    val ememberDob: String? = null,

    @field:SerializedName("emember_nohp")
    val ememberNohp: String? = null,

    @field:SerializedName("emember_email")
    val ememberEmail: String? = null,

    @field:SerializedName("emember_lastupdate")
    val ememberLastupdate: String? = null,

    @field:SerializedName("emember_address")
    val ememberAddress: String? = null
) : Parcelable

这是我调用改造客户端的片段中的 sn-p

RetrofitClient.instance.insertNewMember(RegisterMemberRequestBody(
        memberId,
        username,
        selectedGender,
        fullName,
        password,
        selectedBirthday,
        phoneNumber,
        email,
        lastUpdate,
        address
    )).enqueue(object: Callback<DefaultResponse> {
        override fun onFailure(call: Call<DefaultResponse>, t: Throwable) {
            Toast.makeText(activity as AppCompatActivity, "Request Failed!", Toast.LENGTH_LONG).show()
            binding.registerFormRelativeLayout.visibility = View.VISIBLE
            binding.progressBar.visibility = View.GONE
        }

        override fun onResponse(
            call: Call<DefaultResponse>,
            response: Response<DefaultResponse>
        ) {
            Log.i("register", response.body().toString())
            //renderSnackBar()
            navigateToLoginPage()
        }
    })

参数(memberId,username,selectedGender,fullName,password,selectedBirthday,phoneNumber,email,lastUpdate,address)类是从一些 EditTexts 中挑选出来的。这些是我在 LogCat 中打印时输入的值:

但是,当函数执行时,它在数据库 (Firebase) 中显示为:

如您所见,有些值没有插入到数据库中。任何想法这是怎么发生的?我需要改变什么吗?如果我想指出任何细节,请随时询问。

注意:fullnameaddressphoneNumberselectedBirthDayselectedGender 是从不同的 Fragment 传递过来的。但我确信 100% 没有问题,因为当我在当前片段中打印它时它显示了所需的值。

**编辑:**

这就是值fullnameaddressphoneNumberselectedBirthDayselectedGender 从其他片段传递到此片段的方式。这是当前片段中接受值的另一个 sn-p

lateinit var binding: FragmentRegisterPart2Binding

lateinit var fullName: String
lateinit var selectedGender: String
lateinit var selectedBirthday: String
lateinit var phoneNumber: String
lateinit var address: String
lateinit var username: String
lateinit var password: String
lateinit var email: String
lateinit var confirmPassword: String
var memberId: String = ""
var lastUpdate: String = "0000-00-00T00:00:00.000Z"


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

    binding = DataBindingUtil.inflate(
        inflater,
        R.layout.fragment_register_part2, container, false
    )

    val args = arguments?.let {
        RegisterFragmentPart2Args.fromBundle(
            it
        )
    }

    if (args != null) {
        fullName = args.fullName
        address = args.address
        phoneNumber = args.phoneNumber
        selectedBirthday = args.selectedBirthday
        selectedGender = args.selectedGender
    }

    binding.finishRegistrationButton.setOnClickListener {
        validateInformationInput()
    }

    binding.progressBar.visibility = View.GONE

    return binding.root
}

编辑 我尝试过的事情包括:

  • 确保改造客户端对象没有任何问题,因为它成功地将数据发送到服务器

  • 从另一个片段传递的值没有问题,因为它在当前片段中正确显示

  • 接口没有问题,因为它成功发送了一些值

  • Data 类结构没有问题,因为它也成功发送了一些值。

现在我想知道数据类的某些属性是否没有正确删除或类似的东西。 (我在 Android Studio 中使用了一个扩展,它会自动将复制的 Json 主体转换为适当的数据类)

【问题讨论】:

    标签: android kotlin retrofit


    【解决方案1】:

    发生这种情况是因为您使用 EditTexts 中的某些字段创建了数据类,当您这样做时,其他字段被设置为 null,因为您已将默认值设置为 null。此外,您已将所有 val 放在所有字段上,因此当您创建具有一些值和一些空值的对象时,您以后无法从 api 更改它们

    【讨论】:

    • 那么...我应该在哪里或改变什么?
    • 给出你从改造 var 而不是 val 获得的字段
    • 您是指RegisterMemberRequestBody 数据类中的那些?对不起。不工作。
    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多