You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:21:07