【问题标题】:Reading data from a firebase database snapshot从 firebase 数据库快照中读取数据
【发布时间】:2020-03-09 14:54:39
【问题描述】:

所以,我正在尝试拍摄我的数据库的快照,并在数组字符串中添加项目及其子项。

我的主要活动是这样的

    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:24798 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String in.tvac.akshayejh.firebasesearch.AdvancedQuery.getName()” 在 in.tvac.akshayejh.firebasesearch.AdvancedSearch.dataQuery(AdvancedSearch.java:140) 在 in.tvac.akshayejh.firebasesearch.AdvancedSearch.access 500 美元(AdvancedSearch.java:20) 在 in.tvac.akshayejh.firebasesearch.AdvancedSearch$2.onDataChange(AdvancedSearch.java:115) 在 com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@16.0.4:183) 在 com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.4:75) 在 com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.4:63) 在 com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.4:55) 在 android.os.Handler.handleCallback(Handler.java:873) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:193) 在 android.app.ActivityThread.main(ActivityThread.java:6669) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

【问题讨论】:

  • 添加崩溃日志可能有助于我们为您提供帮助。
  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。也请回复@AlexMamo
  • @Traendy 我已经在上面的帖子中包含了错误日志。
  • @AlexMamo,我已经在上面的帖子中包含了错误日志。
  • 请编辑您的问题并向我们展示您设置适配器的代码。

标签: java android firebase firebase-realtime-database


【解决方案1】:

解析你的 `` 在做什么真的很难。惯用的做法是只读取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
    }
}

【讨论】:

    【解决方案2】:

    据我所知,您没有在任何地方初始化myRef,当您执行myRef.addListenerForSingleValueEvent(... 时,这将导致NullPointerException

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

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

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

    【讨论】:

    • 嘿,对不起,我忘了在帖子的代码中添加它,但我做了 mFirebaseDatabase = FirebaseDatabase.getInstance(); myRef = mFirebaseDatabase.getReference();
    • 感谢您的确认。在这种情况下,Traendy 和 Alex 关于实际崩溃的问题就剩下了。我还强烈建议阅读how to create a minimal, complete, verifiable example,因为它可以防止错过我回答的陈述。
    • 感谢您提供该链接,以后我一定会查阅它。我已经添加了崩溃日志,但老实说,我无法充分利用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2020-09-10
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2018-02-17
    相关资源
    最近更新 更多