Firebase Database冲突getter错误:isFocusable问题求助
问题排查与解决
核心错误原因
你在保存任务时错误地将RecyclerView对象传入了Firebase的setValue()方法,而非你创建的DataClass_Task实例。Firebase尝试序列化RecyclerView(Android View类)时,发现View内部存在isFocusable的冲突getter,从而抛出异常。此外,DataClass_Task实体类的注解使用错误,会导致Firebase无法正确序列化任务数据。
分步解决
1. 修正Firebase保存逻辑
找到CategoriesActivity中这段错误代码:
database.getReference().child("users").child(auth.getUid()).child("Tasks").child(taskId).setValue(recyclerView)
将setValue(recyclerView)改为setValue(task)——你要保存的是任务数据对象,不是UI控件:
database.getReference().child("users").child(auth.getUid()).child("Tasks").child(taskId).setValue(task)
2. 修正DataClass_Task实体类注解
你给任务核心字段的getter都标记了@Exclude,这会让Firebase忽略这些字段,无法正确保存数据。仅对不需要存入数据库的字段(如taskId、key)添加@Exclude,修正后的实体类如下:
package com.topurayhan.chatter; import com.google.firebase.database.Exclude; public class DataClass_Task { public String dataTitle; public String dataDesc; public String dataDue; @Exclude public String taskId; @Exclude public String key; // Firebase序列化必须的无参构造 public DataClass_Task() {} // 核心字段构造方法 public DataClass_Task(String dataTitle, String dataDesc, String dataDue) { this.dataTitle = dataTitle; this.dataDesc = dataDesc; this.dataDue = dataDue; } // 核心字段的Getter/Setter(不要加@Exclude) public String getDataTitle() { return dataTitle; } public void setDataTitle(String dataTitle) { this.dataTitle = dataTitle; } public String getDataDesc() { return dataDesc; } public void setDataDesc(String dataDesc) { this.dataDesc = dataDesc; } public String getDataDue() { return dataDue; } public void setDataDue(String dataDue) { this.dataDue = dataDue; } // 无需存入数据库的字段,Getter加@Exclude @Exclude public String getTaskId() { return taskId; } public void setTaskId(String taskId) { this.taskId = taskId; } @Exclude public String getKey() { return key; } public void setKey(String key) { this.key = key; } }
3. 优化任务ID生成逻辑
统一用用户节点下的push()生成唯一任务ID,避免混乱:
// 生成用户专属的唯一任务ID String taskId = database.getReference().child("users").child(auth.getUid()).child("Tasks").push().getKey(); // 创建任务实例 DataClass_Task task = new DataClass_Task("Task Name", "Task Description", "Task Due"); task.setTaskId(taskId); // 保存到用户专属节点 database.getReference().child("users").child(auth.getUid()).child("Tasks").child(taskId).setValue(task) .addOnSuccessListener(aVoid -> Log.d(TAG, "Task saved successfully!")) .addOnFailureListener(e -> Log.e(TAG, "Failed to save task: " + e.getMessage()));
内容的提问来源于stack exchange,提问作者Divine Garduque
相关产品推荐
相关产品推荐

