Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在EditText中检索和显示Firebase中的数据,编辑内容并再次保存_Android_Firebase_Firebase Realtime Database_Android Edittext_Firebase Authentication - Fatal编程技术网

Android 在EditText中检索和显示Firebase中的数据,编辑内容并再次保存

Android 在EditText中检索和显示Firebase中的数据,编辑内容并再次保存,android,firebase,firebase-realtime-database,android-edittext,firebase-authentication,Android,Firebase,Firebase Realtime Database,Android Edittext,Firebase Authentication,我想从Firebase检索数据,并将其显示在EditText中,并允许用户在需要时对其进行更改 这是一款使用Firebase作为数据库的android Notes应用程序 我想从Firebase检索数据,并将其显示在EditText中,并允许用户在需要时对其进行更改 public class HomeActivity extends AppCompatActivity { private Toolbar mToolbar; private FloatingActionButt

我想从Firebase检索数据,并将其显示在EditText中,并允许用户在需要时对其进行更改

这是一款使用Firebase作为数据库的android Notes应用程序

我想从Firebase检索数据,并将其显示在EditText中,并允许用户在需要时对其进行更改


public class HomeActivity extends AppCompatActivity {

    private Toolbar mToolbar;
    private FloatingActionButton mFABCreate;

    private FirebaseAuth mFirebaseAuth;
    private RecyclerView mRecyclerView;
    private DatabaseReference mDatabaseReference;

    String mPost_Key;
    String mKey;
    String mTitle;
    String mNote;

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

        mFirebaseAuth  = FirebaseAuth.getInstance();
        FirebaseUser lFirebaseUser = mFirebaseAuth.getCurrentUser();
        assert lFirebaseUser  != null;
        String uid = lFirebaseUser.getUid();
        mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("AllData").child(uid);
        mDatabaseReference.keepSynced(true);



        mRecyclerView = findViewById(R.id.recycler);

        LinearLayoutManager lLinearLayoutManager = new LinearLayoutManager(this);
        lLinearLayoutManager.setStackFromEnd(true);
        lLinearLayoutManager.setReverseLayout(true); 
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(lLinearLayoutManager);


        mToolbar = findViewById(R.id.toolbar);
        mToolbar.setTitle("Quick Note");

        FloatingActionButton fab = findViewById(R.id.Add_Data);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
                startActivity(new Intent(HomeActivity.this, AddActivity.class));
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();

        FirebaseRecyclerAdapter<Items, RecyclerViewAdapter> lAdapter = new FirebaseRecyclerAdapter<Items, RecyclerViewAdapter>(
                Items.class,
                R.layout.show_note,
                RecyclerViewAdapter.class,
                mDatabaseReference) {
            @Override
            protected void populateViewHolder(RecyclerViewAdapter recyclerViewAdapter, final Items items, final int i) {
                recyclerViewAdapter.setTitle(items.getTitle());
                recyclerViewAdapter.setNote(items.getNote());
                recyclerViewAdapter.setDate(items.getDate());

                recyclerViewAdapter.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mPost_Key = getRef(i).getKey();
                        mTitle = items.getTitle();
                        mNote = items.getNote();

                        editData();
                    }
                });

            }
        };
        mRecyclerView.setAdapter(lAdapter);
    }


    private void editData(){
        startActivity(new Intent(getApplicationContext(), EditActivity.class));
    }


    public static class RecyclerViewAdapter extends RecyclerView.ViewHolder{
        View mView;
        public RecyclerViewAdapter(@NonNull View itemView) {
            super(itemView);
            mView = itemView;
        }
        public void setTitle (String title){
            TextView lTitle = mView.findViewById(R.id.showTitle);
            lTitle.setText(title);
        }

        public void setNote (String note){
            TextView lNote = mView.findViewById(R.id.showNote);
            lNote.setText(note);
        }

        public void setDate (String date){
            TextView lDate = mView.findViewById(R.id.showDate);
            lDate.setText(date);
        }
    }

}

Firebase数据:


AllData
  nakrU3ArQNShLzyn9U8X9fAFNeL2
    -LopLNpUFmepM8gvCmHS
      date:
      id:
      note:
      title: 

我的目标是设置从Firebase获得的值,并将其显示在“EditActivity”中

它只显示空白文本

假设没有错误,并且Firebase值中没有保存空字符串,如果查看Firebase中的数据,您有两个ID值,但只查询最上面的ID值

AllData
    nakrU3ArQNShLzyn9U8X9fAFNeL2  # Uid
        -LopLNpUFmepM8gvCmHS  # a specific item 
您需要添加对特定项的另一个引用,然后将值listener添加到该引用中,以便它在EditText中显示。比如说,

String itemId = ...;
mDatabaseReference.child(itemId)
    .addValueEventListener(... 

为了获得该id,当您像这样单击它时,需要将其传递给下一个活动

editData(getRef(i).getKey());
因此,在该editData方法中,将id作为额外的意图传递,以便EditActivity可以找到它

private void editData(String itemId) {
    Intent intent = new Intent(HomeActivity.this, EditActivity.class);
    intent.putExtra("EXTRA_ITEM_ID", itemId);
    startActivity(intent);
} 
然后在EditActivity中,您需要获取并使用项目ID来查询特定项目

String itemId = getIntent().getStringExtra("EXTRA_ITEM_ID");
// wouldn't hurt to log the ID value for debugging here 
mDatabaseReference.child(itemId)
    .addValueEventListener(... 
然后保留你已经拥有的一切

那至少应该显示一些东西


然后,您需要在某个位置添加一个保存按钮,以便将值写回Firebase,因为它不会在您键入时自动保存(除非您实现该功能,但我不建议这样做,因为它会创建大量不必要的网络调用)


现在还不清楚这里的问题是什么,但我的第一个观察结果是,您无法知道在EditActivity中单击了哪个音符。。。为此,您需要通过IntentI传递数据。我正在尝试获取存储在我的firebase中的数据并将其显示到edittext中。我理解这一点,并且您的值事件侦听器看起来很好。Firebase中是否有要显示的数据?您显示的值是空的,那么您的问题实际上是关于如何写入数据的吗?你需要在某个地方调用setValue是的我的Firebase中确实有数据好的,那么你哪里有错误?正如我所说,您需要将特定行的引用传递给编辑活动。您得到了
mPost_Key=getRef(i).getKey(),但不使用它做任何事情,然后您正在执行
getReference(mAuth.getUid())
,这将从用户返回所有项目,而不是EditActivity上的特定项目。您能否提供更多信息,我有点困惑。我已经按照你建议的方式做了,但不知道我将如何从你停下来的地方继续。你已经拥有的一切都应该是完全一样的。添加侦听器,并获取值
dataSnapshot.getValue(Items.class)
,然后设置editText这是我得到的错误:由以下原因引起:java.lang.NullPointerException:尝试调用虚拟方法'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)'在空对象引用上这是我的代码
mDatabaseReference.child(itemID).addValueEventListener(新的ValueEventListener(){@Override public void onDataChange(@NonNull DataSnapshot DataSnapshot){String Title=DataSnapshot.getValue(Items.class).getTitle();String Note=dataSnapshot.getValue(Items.class.getTitle();lTitle.setText(Title);lNote.setText(Note);}
听起来像是您删除了这一行,或者它返回了null
mFirebaseDatabase.getReference(mAuth.getUid())
private void editData(String itemId) {
    Intent intent = new Intent(HomeActivity.this, EditActivity.class);
    intent.putExtra("EXTRA_ITEM_ID", itemId);
    startActivity(intent);
} 
String itemId = getIntent().getStringExtra("EXTRA_ITEM_ID");
// wouldn't hurt to log the ID value for debugging here 
mDatabaseReference.child(itemId)
    .addValueEventListener(... 
Items toSave =... 
mDatabaseReference.child(itemId).setValue(toSave);