【问题标题】:Retrieve and display data from Firebase in an EditText and edit content and save it again在 EditText 中从 Firebase 检索和显示数据并编辑内容并再次保存
【发布时间】:2019-09-15 19:35:21
【问题描述】:

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

这是一个使用 Firebase 作为数据库的安卓笔记应用

我想从 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);
        }
    }

}



public class EditActivity extends AppCompatActivity {
    private FirebaseAuth mAuth;
    private DatabaseReference mDatabaseReference;
    private FirebaseDatabase mFirebaseDatabase;
    RecyclerView mRecyclerView;

    String mPost_Key;
    String mTitle, mNote;
    String lTitleFire;
    String lNoteFire;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        final EditText lTitle = findViewById(R.id.YourTitleEdit);
        final TextView lNote = findViewById(R.id.Your_Note_Add);
        mAuth = FirebaseAuth.getInstance();
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        mDatabaseReference = mFirebaseDatabase.getReference(mAuth.getUid());
        mDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Items lGetValues  = dataSnapshot.getValue(Items.class);
                assert lGetValues != null;
                lTitle.setText(lGetValues.getTitle());
                lNote.setText(lGetValues.getNote());
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(getApplicationContext(), "Getting value failed", Toast.LENGTH_LONG).show();

            }
        });

    }

}



public class Items {
    String title;
    String note;
    String date;
    String id;

    public Items() {
    }

    public Items(String title, String note, String date, String id) {
        this.title = title;
        this.note = note;
        this.date = date;
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}    

Firebase 数据:


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

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

【问题讨论】:

  • 不清楚这里的问题是什么,但我的第一个观察是你无法知道在 EditActivity 中点击了哪个笔记......为此,你需要通过 Intent 传递数据
  • 我正在尝试获取存储在我的 firebase 中的数据并将其显示到编辑文本中。
  • 我明白这一点,您的价值事件侦听器看起来不错。您在 Firebase 中有要显示的数据吗?您显示的值是空白的,所以您的问题实际上是关于如何写入数据?您需要在某处调用 setValue firebase.google.com/docs/database/android/read-and-write
  • 是的,我的 firebase 中确实有数据
  • 好的,那么您是否在任何地方出现错误?就像我说的,您需要将对特定行的引用传递给编辑活动。你得到了mPost_Key = getRef(i).getKey();,但没有用它做任何事情,那么你正在做getReference(mAuth.getUid()),这将返回用户的所有项目,而不是特定的项目

标签: android firebase firebase-realtime-database android-edittext firebase-authentication


【解决方案1】:

它只是显示空白的 EditText

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

AllData
    nakrU3ArQNShLzyn9U8X9fAFNeL2  # Uid
        -LopLNpUFmepM8gvCmHS  # a specific item 

您需要添加对特定项目的另一个引用,然后将值侦听器添加到它以使其显示在 EditText 中。例如,

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

为了获取该 ID,您需要在单击它时将其传递给下一个活动

editData(getRef(i).getKey());

因此,在该 editData 方法中,将 id 作为 Intent extra 传递,以便 EditActivity 可以找到它

private void editData(String itemId) {
    Intent intent = new Intent(HomeActivity.this, EditActivity.class);
    intent.putExtra("EXTRA_ITEM_ID", itemId);
    startActivity(intent);
} 

然后在EditActivity中,需要获取并使用item ID来查询特定的item

String itemId = getIntent().getStringExtra("EXTRA_ITEM_ID");
// wouldn't hurt to log the ID value for debugging here 
mDatabaseReference.child(itemId)
    .addValueEventListener(... 

然后保留你已经拥有的一切

这至少应该显示一些东西......


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

Items toSave =... 
mDatabaseReference.child(itemId).setValue(toSave);

【讨论】:

  • 关于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(new 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())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多