【问题标题】:Firebase getValue() method doesn't work in app widgetFirebase getValue() 方法在应用小部件中不起作用
【发布时间】:2020-03-29 16:47:27
【问题描述】:

这是我的第一个问题:)

这是我的 Firebase:

{
  "Users": {
    {
      "G2u5-1yQI-GaKN" : {
        "login" : "Tom",
        "name" : "Tom",
        "password" : "1234"
      },
      "JMtk-T2AZ-LJY8" : {
        "login" : "Ann",
        "name" : "Ann",
        "password" : "abcd"
      }
    }
  }
}

My Firebase

我想获取 JMtk-T2AZ-LJY8 用户 (Ann) 的 name 键的值并将其设置为我的应用小部件中 TextView 的文本。

我的代码是:

final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_widget);

final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users").child("JMtk-T2AZ-LJY8");

views.setTextViewText(R.id.textView2, String.valueOf(reference.child("name").getValue()));

这里不能使用getValue()方法,不知道为什么?

当我在 MainActivity 的 onCreate 方法中使用类似的代码时,它可以正常工作(它返回“Ann:),但在应用小部件中却没有。解决方案是什么?

【问题讨论】:

标签: android firebase firebase-realtime-database android-remoteview


【解决方案1】:

正如 Doug 所说,您实际上还没有加载任何数据。您现在拥有的代码仅定义了对数据库中某个位置的引用。要从该位置获取实际数据,您需要将侦听器附加到引用。

类似:

final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_widget);

final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users").child("JMtk-T2AZ-LJY8");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
      views.setTextViewText(
        R.id.textView2, 
        dataSnapshot.child("name").getValue(String.class)
      );
    }

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

如果您只需要用户名,您还可以将侦听器附加到该属性并节省一些带宽:

final DatabaseReference reference = FirebaseDatabase.getInstance().getReference()
                                       .child("Users/JMtk-T2AZ-LJY8/name");

reference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
      views.setTextViewText(
        R.id.textView2, 
        dataSnapshot.getValue(String.class)
      );
    }

【讨论】:

  • 我试过了,但在这种情况下,我不能在这里使用 getValue() 方法。编辑器将其涂成红色。
  • 在您的代码中:reference.getValue(String.class) - 我更改了对 dataSnapshot 的引用,结果是:我可以使用 getValue,但它返回 null
  • 我认为问题在于我试图在 MyWidget.java 中获取此值,而不是在此小部件的意图服务中
  • 是的,reference 是复制/粘贴错误。我现在修好了。除此之外,这段代码没有理由从数据库中获得null。您可能想记录 dataSnapshot.child("name").getValue(String.class) 并查看是否正确。
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2022-01-11
  • 2021-01-16
  • 2012-10-09
  • 1970-01-01
相关资源
最近更新 更多