【问题标题】:Retrieving data from Firebase in Android activity在 Android 活动中从 Firebase 检索数据
【发布时间】:2018-09-20 08:32:50
【问题描述】:

我阅读了很多关于如何从 Firebase 数据库实例获取数据的主题,但没有一个对我有用。

我在活动中的代码:

public class Violations extends AppCompatActivity
{
TextView textView7;

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference dbref = database.getReference("save");

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

    textView7 = findViewById(R.id.textView7);

    dbref.addValueEventListener(new ValueEventListener()
    {
        ArrayList<String> Violations = new ArrayList<>();
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            for (DataSnapshot postSnapshot: dataSnapshot.getChildren())
            {
                Violations.add(postSnapshot.getValue().toString());
                System.out.println(postSnapshot.getValue().toString());
            }
            for(int i=0; i < Violations.size(); i++)
            {
                textView7.setText(textView7.getText() + Violations.get(i) + System.lineSeparator());
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
}
}

那里没有错误,但没有数据显示。我很确定,我的问题是连接到正确的实例并检索数据。

Firebase 数据,如下所示:

有人可以帮我吗?

提前谢谢你。

【问题讨论】:

  • 你能在onDataChange() 中放一个断点来检查它是否触发吗?除此之外,你应该看看How to denormalize data in Firebase,因为如果你为你的数据库保留这个精确的结构,你真的会遇到一些麻烦

标签: java android firebase firebase-realtime-database


【解决方案1】:

初始化 Firebase 数据库和 DatabaseReference 内的 onCreate() 方法:

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

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference dbref = database.getReference("save");

    ...
    ..

此外,您获得的参考是 save,但 Firebase 数据库显示为:you violate ...。您可以尝试将名称更改为 save 或获取正确的数据:you violate ...

【讨论】:

  • 初始化不是问题(我检查过)。问题出在 firebase 链接中。
  • 好吧,如果你想获取所有数据,你可以使用addValueEventListener()(根据你的要求)但是,我没有在数据库中看到save child,这很奇怪.
【解决方案2】:

尝试使用addListenerForSingleValue() 而不是addValueEventListener()。希望能帮助到你。并将您的 Firebase 链接 save 更改为 you violate your own speed limit with

【讨论】:

  • 问题出在 firebase 链接中。所以这解决了这个问题。非常感谢。
【解决方案3】:

我在您的数据库架构中看不到名为save 的引用,但我看到一个名为You violate your own speed limit with 的引用,必须在您的引用中使用它以便能够从数据库中获取数据。所以要解决这个问题,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("You violate your own speed limit with");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        ArrayList<String> violations = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String speed = ds.getValue(String.class);
            violations.add(speed);
            Log.d(TAG, speed);
        }

        //Do what you need to do with y our violations list
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
ref.addListenerForSingleValueEvent(valueEventListener);

您的 logcat 中的结果将是所有这些值:

3 km / h at time: ...
3 km / h at time: ...
//an so on

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多