我有一个Python脚本,可以在Firebase上实时添加数据。 该脚本使用摄像头检测冰箱中有哪些食物,并添加发现的食物。 我想构建一个Android应用,以获取最新数据(即网络摄像头进行的最新检测)
例如,在下面的图像中,上次食物检测仅为yogurt
,之前的食物检测为yogurt
和egg
我正在使用以下代码在listview
rv = (ListView) findViewById(R.id.myrv);
ref = FirebaseDatabase.getInstance().getReference();
final ArrayAdapter<String> adpt = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, foodList);
rv.setAdapter(adpt);
ref.child("fridge").orderByKey().limitToLast(1).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String message = dataSnapshot.getValue(String.class);
foodList.add(message);
adpt.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我期望yogurt
中显示listview
,但是出现此错误
com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String
at com.google.android.gms.internal.zzelw.zzb(Unknown Source)
at com.google.android.gms.internal.zzelw.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
我想知道这是否是获取最新food
的{{1}}中内容的正确代码,以及如何解决key
错误
谢谢
答案 0 :(得分:1)
这里:
String message = dataSnapshot.getValue(String.class);
这可能是导致问题的原因,因为您似乎将String.class
的{{1}} 哈希图。
尝试这样的事情:
String
或者生孩子然后去Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
:
String
编辑#2:
也可以通过添加另一个孩子(for(DataSnapshot ds : dataSnapshot.getChildren()) {
String myString = ds.child("food").getValue(String.class));
// print myString or add to list..
}
)来完成:
food
使用第一个结构。
使用ref = FirebaseDatabase.getInstance().getReference().child("fridge").child("food")...// listener
方法,然后通知数据更改等以影响UI。
答案 1 :(得分:0)
这是我最终得到的解决方案,以防万一有人需要它
food = (TextView) findViewById(R.id.food);
rv = (ListView) findViewById(R.id.myrv);
ref = FirebaseDatabase.getInstance().getReference().child("fridge2");
final ArrayAdapter<String> adpt = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myfoodList);
rv.setAdapter(adpt);
ref.orderByKey().limitToLast(1).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
// ArrayList message = dataSnapshot.getValue(ArrayList.class);
GenericTypeIndicator<List<String>> t = new GenericTypeIndicator<List<String>>() {};
List<String> message = dataSnapshot.getValue(t);
myfoodList.clear();
myfoodList.addAll(message);
//myfoodList = message;
adpt.notifyDataSetChanged();
}