当前位置: 首页 > 知识库问答 >
问题:

从firebase数据库快照读取数据

胡景焕
2023-03-14

因此,我尝试拍摄数据库的快照,并添加带有子项的数组字符串中的项。

    private Button mbutton;
    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference myRef;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_advanced_search);
        mbutton = findViewById(R.id.button_search);
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        myRef = mFirebaseDatabase.getReference();
        mbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                goListener();
            }
        });
    }
    private void goListener() {
        myRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                dataQuery(snapshot);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }
    private void dataQuery(DataSnapshot snapshot) {
        for (int y = 0; y !=2; y++) {
            for (DataSnapshot ds : snapshot.getChildren()) {
                AdvancedQuery findInfo = new AdvancedQuery();
                findInfo.setName(ds.child(String.valueOf(y)).getValue(AdvancedQuery.class).getName());
                findInfo.setIngredients(ds.child(String.valueOf(y)).getValue(AdvancedQuery.class).getIngredients());
            }
        }
    }
}

我的set和get java文件如下所示

public class AdvancedQuery {
    public String name, ingredients;
    public AdvancedQuery(){ }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getIngredients() {
        return ingredients;
    }
    public void setIngredients(String ingredients) {
        this.ingredients = ingredients;
    }
}

但是,当我的程序到达dataQuery方法并尝试获取和设置名称和成分时,它会崩溃。有人能解释一下我做错了什么,以及是否有更好的方法来使用数据库快照来做到这一点吗?

进程:in.tvac.akshayejh.firebasesearch,PID:24798java.lang.NullPointerExcture:尝试在in.tvac.akshayejh.firebasesearch.AdvancedS的空对象引用上调用虚拟方法'java.lang.Stringin.tvac.akshayejh.firebasesearch.AdvancedQuery.getName()'earch.data查询(AdvancedSearch.java:140)在in.tvac.akshayejh.firebasesearch.AdvancedSearch.access500美元(AdvancedSearch.java:20)在in.tvac.akshayejh.firebasesearch.AdvancedSearch$2.onDataChange(AdvancedSearch.java:115)在com.google.firebase.database.查询$1.onDataChange(com.google.firebase: Firebase数据库@@16.0.4:183),com.google.firebase.database.core.ValueEventRegistration.fire事件(com.google.firebase: Firebase数据库@@16.0.4:75),网址为com. google. Firebase.数据库. core. view。数据事件。火(com. google. Firebase: Firebase-数据库@@16.0.4:63)在com. google. Firebase.数据库. core. view。在android. os的EventRaiser1 USD. run(com. google. Firebase: Firebase数据库@@16.0.4:55)。Handler. handleCallback(Handler. java: 873)在android. os.在android. os.在android. app.ActivityThread. main(ActivityThread. java: 6669)在java. lang.反射。方法调用(本机方法)在com. android. interal. os。RuntimeInit$method odAndArgsCaller. run(RuntimeInit. java: 493)在com. android. interal. os。ZygoteInit. main(ZygoteInit. java: 858)

共有2个答案

杭令
2023-03-14

据我所知,您没有在任何地方初始化myRef,这将导致执行myRef时出现NullPointerException。addListenerForSingleValueEvent(…)。

如果这确实是您遇到的错误,请确保在使用它之前初始化myRef,如下所示:

myRef = FirebaseDatabase.getInstance().getReference().child("Recipes");

我不完全确定是否需要. child("Recipes"),所以删除/修改以适应您的数据模型和代码的逻辑。

柴声
2023-03-14

很难分析你的``在做什么。惯用的方法是只读取Recipes节点,然后使用snapshot在下面的子节点上循环。getChildren()

比如:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Recipes");

ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        for (DataSnapshot recipeSnapshot: snapshot.getChildren()) {
            AdvancedQuery findInfo = recipeSnapshot.getValue(AdvancedQuery.class);

            ...

        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // NEVER ignore errors
    }
}
 类似资料:
  • 我试图将值从数据库快照放入类对象的映射活动代码。 我的车站类别代码和位置类别代码。 在从firebase获取的地图上标记位置的代码。

  • 我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。

  • 我正在尝试优化我的应用程序在Firesbase上的读取次数,并回顾我使用快照监控实时更改的方式。假设我有一个快照,返回10个最新文档,如下所示: 医生说 每次查询结果更改时(即添加、删除或修改文档时),快照处理程序都会收到一个新的查询快照。 这是否意味着每次查询更改时,我都将被计费10次读取?在这个例子中,如果添加了一个新城市(所以使用最新的“日期添加”,所以在查询中排在第一位),它将是1(只是新

  • 我已经花了几个小时阅读产品分支中的0和1。请在Firebase数据库有经验的人帮助我:(

  • 问题内容: 我需要有关从此DataSnapshot结果中获取“消息”对象的帮助 我可以通过获取键值,并且也可以作为对象,这是FireBase自动生成的对象名称。而不是听对象本身。如何使用DataSnapshot成员方法浏览低谷,“发送者”或“消息”并获取其值? 问题答案: 我似乎在为具有多个子项的对象添加值侦听器。我猜这是一个查询,但是如果您在问题中包含代码,那将非常有帮助。但是,在您添加它之前,

  • 我正在尝试读取我的Flutter应用程序中的firebase实时数据库中的数据,并将其分配给模型类,但是,我在控制台中得到了以下错误。 下面是我到目前为止所做的代码 员工类别 我不知道我做错了什么,请帮我解决这个问题