Firebase getValue()在现有对象上返回null

时间:2016-10-11 13:50:55

标签: android firebase firebase-realtime-database

我正在创建一个将数据存储到Firebase数据库的应用。我想从数据库中获取数据并将其转换为自定义列表视图。

我的数据库中的每个数据都用数字标记,我正在设法删除数据,但仍然保持数字序列。例如,当我有数据123时,我删除了数字2,我删除了数字2和数字{{ 1}}首先,我从数字3传输数据,以形成新号码3,其数据曾经存储在数字2中。

执行此操作后,我调用3来获取新数据,并且应用程序因空指针异常而崩溃。我知道有点难以阅读我的问题,但请帮忙。谢谢!

以下是我的价值事件监听器(addValueEventListener是我要上传的数据):

apmodule

以下是我在警告对话框中的删除部分(重新排列方法是删除Firebase上的数据并重新排列数字索引):

final ValueEventListener VEL=new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            apModuleArrayList.clear();
            APModule apModule;
            String name,account,password;
            boolean vip;
            childrenCount=dataSnapshot.getChildrenCount();
            for (int i=0;i<childrenCount;i++){
                name=dataSnapshot.child(Integer.toString(i+1)).child("name:").getValue().toString();
                account=dataSnapshot.child(Integer.toString(i+1)).child("account:").getValue().toString();
                password=dataSnapshot.child(Integer.toString(i+1)).child("password:").getValue().toString();
                vip=(boolean)dataSnapshot.child(Integer.toString(i+1)).child("VIP:").getValue();
                apModule=new APModule(Uid,name,account,password,vip);
                apModuleArrayList.add(apModule);
            }
            refresh();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

重新排列方法:

.setNegativeButton("DELETE", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            databaseReference.child("users").child("UserID").child(Uid).child("data").removeEventListener(VEL);
                            reArrange(position+1);
                            for (int i=0;i<200000000;i++);
                            for (int i=0;i<200000000;i++);
                            for (int i=0;i<200000000;i++);
                            for (int i=0;i<200000000;i++);
                            databaseReference.child("users").child("UserID").child(Uid).child("data").addValueEventListener(VEL);
                        }
                    })

我在重新排列方法中提到的删除方法:

public void reArrange(final int removed) {
    remove(removed);
    databaseReference.child("users").child("UserID").child(Uid).child("data").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ArrayList<APModule> arrayList = new ArrayList<APModule>();
            long child = dataSnapshot.getChildrenCount()+1;
            arrayList.clear();
            for (int i = removed; child > i; i++) {
                String n, a, p;
                boolean v;
                n = (String) dataSnapshot.child(String.valueOf(i + 1)).child("name:").getValue();
                a = (String) dataSnapshot.child(String.valueOf(i + 1)).child("account:").getValue();
                p = (String) dataSnapshot.child(String.valueOf(i + 1)).child("password:").getValue();
                v = (boolean) dataSnapshot.child(String.valueOf(i + 1)).child("VIP:").getValue();
                APModule module = new APModule(Uid, n, a, p, v);
                arrayList.add(module);
            }
            for (int i = removed; child> i; i++){
                remove((int) i+1);
            }
            for (int i=0;i<200000000;i++);
            for(int i=0;(child-removed)>i;i++){
                APModule apModule=arrayList.get(i);
                databaseReference.child("users").child("UserID").child(Uid).child("data").child(Long.toString(i+removed)).child("name:").setValue(apModule.getname());
                databaseReference.child("users").child("UserID").child(Uid).child("data").child(Long.toString(i+removed)).child("account:").setValue(apModule.getAccount());
                databaseReference.child("users").child("UserID").child(Uid).child("data").child(Long.toString(i+removed)).child("password:").setValue(apModule.getpassword());
                databaseReference.child("users").child("UserID").child(Uid).child("data").child(Long.toString(i+removed)).child("VIP:").setValue(apModule.getVip());
            }
            for (int i=0;i<200000000;i++);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

这是我的日志猫:

public void remove(int delete){
    databaseReference.child("users").child("UserID").child(Uid).child("data").child(String.valueOf(delete)).child("name:").removeValue();
    databaseReference.child("users").child("UserID").child(Uid).child("data").child(String.valueOf(delete)).child("account:").removeValue();
    databaseReference.child("users").child("UserID").child(Uid).child("data").child(String.valueOf(delete)).child("password:").removeValue();
    databaseReference.child("users").child("UserID").child(Uid).child("data").child(String.valueOf(delete)).child("VIP:").removeValue();
}

VEL中抛出了空指针异常,但我不明白的一件事是,在应用程序崩溃并重新启动应用程序之后,然后使用相同的VEL刷新列表视图,应用程序没有&#39 ;崩溃并显示数据完全正常。

0 个答案:

没有答案