我正在创建一个将数据存储到Firebase数据库的应用。我想从数据库中获取数据并将其转换为自定义列表视图。
我的数据库中的每个数据都用数字标记,我正在设法删除数据,但仍然保持数字序列。例如,当我有数据1
,2
和3
时,我删除了数字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 ;崩溃并显示数据完全正常。