com.google.firebase.database.DatabaseException: 无法将类型 java.lang.String 的对象转换为类型 com.example.events.Model.IMG
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.events.Model.IMG
这是我的 activity 代码:-
class event_images : AppCompatActivity() {
private var recyclerView: RecyclerView? = null
private var imageAdapter: Imageadapter? = null
private var img1: MutableList<IMG>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_event_images)
recyclerView = event_images
recyclerView?.setHasFixedSize(true)
recyclerView?.layoutManager = LinearLayoutManager(baseContext)
img1 = ArrayList()
imageAdapter = baseContext?.let { Imageadapter(it, img1 as ArrayList<IMG>, true) }
recyclerView?.adapter = imageAdapter
val wimagesRef = FirebaseDatabase.getInstance().getReference().child("events")
e_imagesRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (snapshot in dataSnapshot.children){
val image = snapshot.getValue(IMG::class.java)
if (image != null){
event_images.visibility = View.VISIBLE
(img1 as ArrayList<IMG>)?.add(image)
}
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
}
这里是适配器代码:-
class Imageadapter (private var mContext: Context,
private var mimages: List<IMG>,
private var isActivity: Boolean = false) : RecyclerView.Adapter<Imageadapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Imageadapter.ViewHolder {
val view = LayoutInflater.from(mContext).inflate(R.layout.images_adapter, parent, false)
return Imageadapter.ViewHolder(view)
}
override fun onBindViewHolder(holder: Imageadapter.ViewHolder, position: Int) {
val imageid = mimages[position]
Picasso.get().load(imageid.getImageUrl()).into(holder.ImageIv)
holder.Datetv.text = imageid.getDate()
holder.Venuetv.text = imageid.getVenue()
}
override fun getItemCount(): Int {
return mimages.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var ImageIv: ImageView = itemView.image_ret
var Datetv: TextView = itemView.date_ret
var Venuetv: TextView = itemView.venue_ret
}
这是我的模型代码:-
class IMG {
private var ImageUrl: ImageView = ""
private var date: String = ""
private var venue: String = ""
constructor()
constructor(ImageUrl: ImageView,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}
fun getDate(): String
{
return date
}
fun setDate(Date: String){
this.date = Date
}
fun getImageUrl(): String {
return ImageUrl
}
fun setImageUrl(ImageUrl: String){
this.ImageUrl = ImageUrl
}
fun getVenue(): String
{
return venue
}
fun setVenue(Venue: String){
this.venue = Venue
}
}
我的项目错误是:-
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.events.Model.IMG at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203) at com.example.events.event_images$onCreate.onDataChange(event_images.kt:38) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at com.google.firebase.database.core.view.EventRaiser.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
数据库的快照是:-
我不知道如何解决这个错误。
有人可以帮我解决这个问题吗?
这意味着数据库遇到了一个字符串 属性,您的代码表示它应该在您的 snapshot.getValue(IMG::class.java)
调用中期待一个完整的 IMG
对象。
我们无法确定这是为什么,但请检查您数据库中的 events
节点,因为它下面至少有一个子节点 node/property 是一个字符串值,而不是一个IMG
对象。
添加数据库截图后更新:
您的 events
节点包含单个事件的属性。所以当你循环 dataSnapshot.children
时,snapshot
变量将首先指向 date
属性,然后指向 imageurl
属性,然后指向venue
属性。 None 这些属性本身是一个有效的 IMG
对象,这就是 SDK 抛出异常的原因。
最好的解决方案是将您的数据库更改为have/allow events
节点下的多个事件:
events: {
"-Mfdskheuheas...": {
date: "...",
imageurl: "..."
venue: "..."
},
"-Mzsdfhkerqas...": {
date: "...",
imageurl: "..."
venue: "..."
},
}
您通常会在代码中调用 push()
以在数据库中生成额外的级别,这会生成上述 -M...
类型的键。另请参阅 adding items to a list.
上的文档
如果您真的只想在 /events
下拥有单个事件的属性,您可以从 onDataChange
:
中删除循环
override fun onDataChange(dataSnapshot: DataSnapshot) {
val image = dataSnapshot.getValue(IMG::class.java)
if (image != null){
event_images.visibility = View.VISIBLE
(img1 as ArrayList<IMG>)?.add(image)
}
}
如果问题没有解决,您可能需要更改。那么请分享您的数据库快照。
class IMG {
private var ImageUrl: ImageView = ""
和
constructor(ImageUrl: ImageView,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}
到
class IMG {
private var ImageUrl: String = ""
和
constructor(ImageUrl: String,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}
这是我的 activity 代码:-
class event_images : AppCompatActivity() {
private var recyclerView: RecyclerView? = null
private var imageAdapter: Imageadapter? = null
private var img1: MutableList<IMG>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_event_images)
recyclerView = event_images
recyclerView?.setHasFixedSize(true)
recyclerView?.layoutManager = LinearLayoutManager(baseContext)
img1 = ArrayList()
imageAdapter = baseContext?.let { Imageadapter(it, img1 as ArrayList<IMG>, true) }
recyclerView?.adapter = imageAdapter
val wimagesRef = FirebaseDatabase.getInstance().getReference().child("events")
e_imagesRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (snapshot in dataSnapshot.children){
val image = snapshot.getValue(IMG::class.java)
if (image != null){
event_images.visibility = View.VISIBLE
(img1 as ArrayList<IMG>)?.add(image)
}
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
}
这里是适配器代码:-
class Imageadapter (private var mContext: Context,
private var mimages: List<IMG>,
private var isActivity: Boolean = false) : RecyclerView.Adapter<Imageadapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Imageadapter.ViewHolder {
val view = LayoutInflater.from(mContext).inflate(R.layout.images_adapter, parent, false)
return Imageadapter.ViewHolder(view)
}
override fun onBindViewHolder(holder: Imageadapter.ViewHolder, position: Int) {
val imageid = mimages[position]
Picasso.get().load(imageid.getImageUrl()).into(holder.ImageIv)
holder.Datetv.text = imageid.getDate()
holder.Venuetv.text = imageid.getVenue()
}
override fun getItemCount(): Int {
return mimages.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var ImageIv: ImageView = itemView.image_ret
var Datetv: TextView = itemView.date_ret
var Venuetv: TextView = itemView.venue_ret
}
这是我的模型代码:-
class IMG {
private var ImageUrl: ImageView = ""
private var date: String = ""
private var venue: String = ""
constructor()
constructor(ImageUrl: ImageView,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}
fun getDate(): String
{
return date
}
fun setDate(Date: String){
this.date = Date
}
fun getImageUrl(): String {
return ImageUrl
}
fun setImageUrl(ImageUrl: String){
this.ImageUrl = ImageUrl
}
fun getVenue(): String
{
return venue
}
fun setVenue(Venue: String){
this.venue = Venue
}
}
我的项目错误是:-
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.events.Model.IMG at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203) at com.example.events.event_images$onCreate.onDataChange(event_images.kt:38) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at com.google.firebase.database.core.view.EventRaiser.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
数据库的快照是:-
我不知道如何解决这个错误。 有人可以帮我解决这个问题吗?
这意味着数据库遇到了一个字符串 属性,您的代码表示它应该在您的 snapshot.getValue(IMG::class.java)
调用中期待一个完整的 IMG
对象。
我们无法确定这是为什么,但请检查您数据库中的 events
节点,因为它下面至少有一个子节点 node/property 是一个字符串值,而不是一个IMG
对象。
添加数据库截图后更新:
您的 events
节点包含单个事件的属性。所以当你循环 dataSnapshot.children
时,snapshot
变量将首先指向 date
属性,然后指向 imageurl
属性,然后指向venue
属性。 None 这些属性本身是一个有效的 IMG
对象,这就是 SDK 抛出异常的原因。
最好的解决方案是将您的数据库更改为have/allow events
节点下的多个事件:
events: {
"-Mfdskheuheas...": {
date: "...",
imageurl: "..."
venue: "..."
},
"-Mzsdfhkerqas...": {
date: "...",
imageurl: "..."
venue: "..."
},
}
您通常会在代码中调用 push()
以在数据库中生成额外的级别,这会生成上述 -M...
类型的键。另请参阅 adding items to a list.
如果您真的只想在 /events
下拥有单个事件的属性,您可以从 onDataChange
:
override fun onDataChange(dataSnapshot: DataSnapshot) {
val image = dataSnapshot.getValue(IMG::class.java)
if (image != null){
event_images.visibility = View.VISIBLE
(img1 as ArrayList<IMG>)?.add(image)
}
}
如果问题没有解决,您可能需要更改。那么请分享您的数据库快照。
class IMG {
private var ImageUrl: ImageView = ""
和
constructor(ImageUrl: ImageView,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}
到
class IMG {
private var ImageUrl: String = ""
和
constructor(ImageUrl: String,
date: String,
venue: String){
this.ImageUrl = ImageUrl
this.date= date
this.venue = venue
}