Android 在EditText中检索和显示Firebase中的数据,编辑内容并再次保存
我想从Firebase检索数据,并将其显示在EditText中,并允许用户在需要时对其进行更改 这是一款使用Firebase作为数据库的android Notes应用程序 我想从Firebase检索数据,并将其显示在EditText中,并允许用户在需要时对其进行更改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
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);}
听起来像是您删除了这一行,或者它返回了nullmFirebaseDatabase.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);