android - Firebase getValue() 方法在应用小部件中不起作用
问题描述
这是我在这里的第一个问题:)
这是我的火力基地:
{
"Users": {
{
"G2u5-1yQI-GaKN" : {
"login" : "Tom",
"name" : "Tom",
"password" : "1234"
},
"JMtk-T2AZ-LJY8" : {
"login" : "Ann",
"name" : "Ann",
"password" : "abcd"
}
}
}
}
我想获取 JMtk-T2AZ-LJY8 用户(Ann)的名称键值并将其设置为我的应用程序小部件中的 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 :),但在应用程序小部件中却没有。解决方案是什么?
解决方案
正如 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)
);
}
推荐阅读
- python - 如何通过 logging.config.dictConfig 指定命名器和旋转器 - FileHandler
- javascript - 如何在没有 useEffect 的 React 组件中使用异步等待
- autodesk-forge - B360 Autodesk Forge 未从链接文件中获取房间几何图形
- python - 我正在尝试在 tkinter 中创建新窗口后创建一个新窗口并执行一个函数
- sql-server - SQL SSMS 键盘快捷键查找案例语句的结尾
- javascript - 什么 window.location.href 在页面中返回?
- assembly - 如何让 llvm 使用“或”指令进行加速
- spring-boot - 如何仅使用@Id(代理对象)检索实体对象,检查它是否存在并将其分配给@ManyToOne 关联
- qt - 向 QTableWidget 添加行时如何防止第一个 CellWidget 折叠
- c++ - 一个用于发送和接收数据包的 TCP 套接字