Java 有没有办法将表格行保存到Firebase中?实时还是Firestore?

Java 有没有办法将表格行保存到Firebase中?实时还是Firestore?,java,android,firebase,Java,Android,Firebase,我制作了这个移动应用程序,可以在按下按钮后添加表格行。每行包含一个Edittext、四个下拉菜单(微调器)和一个删除行的按钮。按下“添加”按钮后,每一行都像一个副本。现在,我唯一的问题是如何将特定内容保存到firebase的实时数据库或firestore中。你们有没有关于如何做到这一点的建议,有什么资源,或者这个问题很广泛?我可以具体说明一些你感到困惑的事情 我可以保存一个包含文档标题的编辑文本,它成功地工作,除了表行,因为它包含多种数据类型。我刚听说firebase只能保存原始数据类型 这是与

我制作了这个移动应用程序,可以在按下按钮后添加表格行。每行包含一个Edittext、四个下拉菜单(微调器)和一个删除行的按钮。按下“添加”按钮后,每一行都像一个副本。现在,我唯一的问题是如何将特定内容保存到firebase的实时数据库或firestore中。你们有没有关于如何做到这一点的建议,有什么资源,或者这个问题很广泛?我可以具体说明一些你感到困惑的事情

我可以保存一个包含文档标题的编辑文本,它成功地工作,除了表行,因为它包含多种数据类型。我刚听说firebase只能保存原始数据类型

这是与问题相关的代码,因此我不必粘贴所有357行代码

    private android.support.v7.widget.Toolbar maintoolbar, editToolBar;
    private FirebaseAuth mAuth;
    private FloatingActionButton fab;


    private RelativeLayout layoutMain;
    private RelativeLayout layoutButtons;
    private RelativeLayout layoutContent;
    private boolean isOpen = false;


    private Button addnewRowButton, saveItButton;
    private EditText titleofDoc;
    private Context context = null;
    private ProgressBar pb;




    private DatabaseReference dr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mAuth = FirebaseAuth.getInstance();
        dr = FirebaseDatabase.getInstance().getReference().child("Notes").child(mAuth.getCurrentUser().getUid());

        maintoolbar = findViewById(R.id.mainToolBar);
        setSupportActionBar(maintoolbar);

        getSupportActionBar().setTitle("Files");

        layoutMain = findViewById(R.id.mainLays);
        layoutButtons = findViewById(R.id.layoutButtons);
        layoutContent = findViewById(R.id.layoutContent);


        addnewRowButton = findViewById(R.id.AddRow);
        saveItButton = findViewById(R.id.SaveThis);
        titleofDoc = findViewById(R.id.TitleofDoc);
        editToolBar = findViewById(R.id.main_edit_toolbar);
        pb = findViewById(R.id.progressBar2);


        saveItButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String title = titleofDoc.getText().toString().trim();

                if (!TextUtils.isEmpty(title)) {
                    pb.setVisibility(View.VISIBLE);
                    createNew(title);
                    pb.setVisibility(View.INVISIBLE);
                } else {
                    Snackbar.make(v, "Fill Empty Fields", Snackbar.LENGTH_SHORT).show();
                    pb.setVisibility(View.INVISIBLE);
                }
            }
        });


        addnewRowButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addNewRow();
            }
        });

        fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewMenu();
            }
        });

    }
这是生成表行的方法

    private void addNewRow() {
        final TableLayout tl = findViewById(R.id.tbllays);
        String[] teamRoles = {"Director", "Marketing", "Team", "All"};
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, teamRoles);

        context = getApplicationContext();
        //adds new row

        final TableRow tbr = new TableRow(context);

        TableRow.LayoutParams layoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT);
        tbr.setLayoutParams(layoutParams);

        //add edittext to name the task
        EditText editText = new EditText(context);
        editText.setHint("Add Task");
        tbr.addView(editText, 0);

        //add spinner to assign teams
        Spinner toDo = new Spinner(context);
        toDo.setAdapter(adapter);
        tbr.addView(toDo, 1);

        //add spinner to assign teams
        Spinner InProgress = new Spinner(context);
        InProgress.setAdapter(adapter);
        tbr.addView(InProgress, 2);

        //add spinner to assign teams
        Spinner Test = new Spinner(context);
        Test.setAdapter(adapter);
        tbr.addView(Test, 3);

        //add spinner to assign teams
        Spinner Done = new Spinner(context);
        Done.setAdapter(adapter);
        tbr.addView(Done, 4);


        // Add a button in the second column
        Button button = new Button(context);
        button.setText("X");
        tbr.addView(button, 5);
        button.setBackgroundColor(Color.rgb(159, 168, 218));

        // Get delete table row button.
        Button deleteRowButton = (Button) button;
        deleteRowButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tbr.removeAllViews();
            }
        });


        tl.addView(tbr);

    }
private void addNewRow(){
最终表格布局tl=findViewById(R.id.Tblays);
字符串[]teamRoles={“主管”、“营销”、“团队”、“所有”};
最终ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u spinner\u dropdown\u项目,teamRoles);
context=getApplicationContext();
//添加新行
最终表格行tbr=新表格行(上下文);
TableRow.LayoutParams LayoutParams=新建TableRow.LayoutParams(TableRow.LayoutParams.WRAP_内容);
tbr.setLayoutParams(layoutParams);
//添加edittext以命名任务
EditText EditText=新的EditText(上下文);
setHint(“添加任务”);
tbr.addView(编辑文本,0);
//添加微调器以分配团队
微调器toDo=新微调器(上下文);
toDo.setAdapter(适配器);
待审查添加视图(toDo,1);
//添加微调器以分配团队
微调器InProgress=新微调器(上下文);
进程设置适配器(适配器);
待审查添加视图(正在进行中,2);
//添加微调器以分配团队
微调器测试=新微调器(上下文);
测试。设置适配器(适配器);
待审查添加视图(测试,3);
//添加微调器以分配团队
微调器完成=新微调器(上下文);
完成。设置适配器(适配器);
待审查添加视图(完成,4);
//在第二列中添加一个按钮
按钮按钮=新按钮(上下文);
按钮设置文本(“X”);
tbr.添加视图(按钮,5);
setBackgroundColor(Color.rgb(159、168、218));
//获取删除表行按钮。
按钮deleteRowButton=(按钮)按钮;
deleteRowButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
tbr.removeAllViews();
}
});
tl.addView(待定);
}
这是一种只能保存标题而不是内容(本例中为表行)的方法

private void createNew(字符串标题){
if(mAuth.getCurrentUser()!=null){
最终数据库引用newThingRef=dr.push();
final Map thingMap=new HashMap();
放置(“标题”,标题);
thingMap.put(“timestamp”,ServerValue.timestamp);
线程mainThread=新线程(newrunnable(){
@凌驾
公开募捐{
newThingRef.setValue(thingMap).addOnCompleteListener(newOnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Toast.makeText(MainActivity.this,“添加注释”,Toast.LENGTH_SHORT.show();
Intent maintent=新的Intent(MainActivity.this、MainActivity.class);
星触觉(主旨);
}否则{
字符串错误=task.getException().getMessage();
Toast.makeText(MainActivity.this,“ERROR:+ERROR,Toast.LENGTH_LONG).show();
}
}
});
}
});
mainThread.start();
}否则{…}
}
这是xml文件(保存编辑器的部分)



您需要在每个微调器的末尾添加一个侦听器,并将其存储在变量中,例如:

Spinner Done = new Spinner(context);
Done.setAdapter(adapter);
Done.setOnItemSelectedListner(this)
tbr.addView(Done, 4);

然后使用DatabaseReference存储此变量。您需要在每个微调器的末尾添加一个侦听器并存储在变量中,例如:

Spinner Done = new Spinner(context);
Done.setAdapter(adapter);
Done.setOnItemSelectedListner(this)
tbr.addView(Done, 4);

然后使用DatabaseReference存储此变量。实际上,如果不想保存行,则要保存基础内容

不要将屏幕上的行视为内容本身,而应将它们视为仅显示您的底层内容。此基础内容可以备份、修改,而屏幕上的显示可以随时完全重建

要转换代码,我建议执行以下一系列步骤:

  • 创建一个类似于
    任务
    类的类,该类包含所需的所有字段(例如
    名称
    团队
  • 在当前活动/片段类中存储
    任务的列表,例如
    私有列表myTasks
  • 编写一个方法
    displayTasks
    ,从布局中删除所有现有行,然后遍历
    myTasks
    并将它们全部绘制到屏幕上
  • 更改
    addNewRow
    ,以便将新的
    任务添加到
    myTasks
    ,然后调用
    displayTasks
  • 现在,您有了一个任务列表,这些任务可以在以后检索
  • 我完全知道这个答案不是你想要的简单的“只做x”,而是你真正需要的答案!所有步骤都非常简单
    Spinner Done = new Spinner(context);
    Done.setAdapter(adapter);
    Done.setOnItemSelectedListner(this)
    tbr.addView(Done, 4);