Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t将java.lang.String类型的对象转换为_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Can';t将java.lang.String类型的对象转换为

Android Can';t将java.lang.String类型的对象转换为,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在将另一个表添加到firebase数据库后出现问题。它给了我以下错误: com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为 这是我的代码,如果我有这样的数据库,它可以正常工作: 和代码: 主要活动代码: rvOrder = (RecyclerView) findViewById(R.id.rvOrders); rvOrder.setLayoutManager(new LinearLayoutMan

在将另一个表添加到firebase数据库后出现问题。它给了我以下错误:

com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为

这是我的代码,如果我有这样的数据库,它可以正常工作:

和代码:

主要活动代码:

rvOrder = (RecyclerView) findViewById(R.id.rvOrders);
rvOrder.setLayoutManager(new LinearLayoutManager(this));

databaseReference= FirebaseDatabase.getInstance().getReference();
firebaseHelper=new FirebaseHelper(databaseReference);

myAdapter=new MyAdapter(this,firebaseHelper.retrieve());
rvOrder.setAdapter(myAdapter);

databaseReference.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        rvOrder.setAdapter(myAdapter);
        myAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});
Firebase帮助程序代码:

public class FirebaseHelper {

DatabaseReference databaseReference ;
Boolean saved = null;
ArrayList<Order> orders = new ArrayList<>();

public FirebaseHelper(DatabaseReference databaseReference) {
    this.databaseReference = databaseReference;
}

public Boolean save(Order order) {
    if (order == null) {
        saved = false;
    } else {
        try {
            databaseReference.child("Orders").push().setValue(order);
            saved = true;

        } catch (DatabaseException e) {
            e.printStackTrace();
            saved = false;
        }
    }
    return saved;
}

private void fetchData(DataSnapshot dataSnapshot) {
    orders.clear();

    for(DataSnapshot ds : dataSnapshot.getChildren()) {

        System.out.println(ds.getValue(Order.class));
        Order order = ds.getValue(Order.class);
        orders.add(order);
    }
}

public ArrayList<Order> retrieve() {
    databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            fetchData(dataSnapshot);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            fetchData(dataSnapshot);

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return orders;
}

在firebasehelper中:

for(DataSnapshot ds : dataSnapshot.getChildren()) {
    System.out.println(ds.getValue(Order.class));
    Order order = ds.getValue(Order.class);
    orders.add(order);
}

然后我可以向数据库中添加其他表,但我只从Orders表中获取最后一项

我想向数据库中添加多个包含多个项目的表,还想从“Orders”表中获取所有项目


有人能给我提些建议吗?

我认为您需要相应地更新此方法:

public Boolean save(Order order) {
    if (order == null) {
        saved = false;
    } else {
        try {
            databaseReference.child("Orders").push().setValue(order);
            saved = true;

        } catch (DatabaseException e) {
            e.printStackTrace();
            saved = false;
        }
    }
    return saved;
}
尝试更改:

databaseReference.child("Orders").push().setValue(order);
致:

此外,要检索所有订单,请继续使用增强循环:

    for(DataSnapshot ds : dataSnapshot.getChildren()) {

    System.out.println(ds.getValue(Order.class));
    Order order = ds.getValue(Order.class);
    orders.add(order);
}

我认为您需要相应地更新此方法:

public Boolean save(Order order) {
    if (order == null) {
        saved = false;
    } else {
        try {
            databaseReference.child("Orders").push().setValue(order);
            saved = true;

        } catch (DatabaseException e) {
            e.printStackTrace();
            saved = false;
        }
    }
    return saved;
}
尝试更改:

databaseReference.child("Orders").push().setValue(order);
致:

此外,要检索所有订单,请继续使用增强循环:

    for(DataSnapshot ds : dataSnapshot.getChildren()) {

    System.out.println(ds.getValue(Order.class));
    Order order = ds.getValue(Order.class);
    orders.add(order);
}

在第一个代码段中,从数据库的根目录中读取。由于您正在尝试读取订单,因此应改为读取
/orders

databaseReference= FirebaseDatabase.getInstance().getReference();
firebaseHelper=new FirebaseHelper(databaseReference);

//myAdapter=new MyAdapter(this,firebaseHelper.retrieve());
//rvOrder.setAdapter(myAdapter);

databaseReference.child("Orders").addValueEventListener(new ValueEventListener() {
现在,在您的
onDataChange
中,您可以通过循环读取订单。由于您已经在
FirebaseHelper.fetchData
中精确地执行了该操作,因此可以调用该方法:

public void onDataChange(DataSnapshot dataSnapshot) {
    firebaseHelper.fetchData(dataSnapshot);
}
现在只需将数据从
firebaseHelper.orders
连接到适配器和视图:

public void onDataChange(DataSnapshot dataSnapshot) {
    firebaseHelper.fetchData(dataSnapshot);
    myAdapter=new MyAdapter(this,firebaseHelper.orders);
    rvOrder.setAdapter(myAdapter);
}

最后一步需要将
firebaseheloper.orders
public,并且在从数据库根目录读取的第一个代码段中,某些变量可能必须是
final

。由于您正在尝试读取订单,因此应改为读取
/orders

databaseReference= FirebaseDatabase.getInstance().getReference();
firebaseHelper=new FirebaseHelper(databaseReference);

//myAdapter=new MyAdapter(this,firebaseHelper.retrieve());
//rvOrder.setAdapter(myAdapter);

databaseReference.child("Orders").addValueEventListener(new ValueEventListener() {
现在,在您的
onDataChange
中,您可以通过循环读取订单。由于您已经在
FirebaseHelper.fetchData
中精确地执行了该操作,因此可以调用该方法:

public void onDataChange(DataSnapshot dataSnapshot) {
    firebaseHelper.fetchData(dataSnapshot);
}
现在只需将数据从
firebaseHelper.orders
连接到适配器和视图:

public void onDataChange(DataSnapshot dataSnapshot) {
    firebaseHelper.fetchData(dataSnapshot);
    myAdapter=new MyAdapter(this,firebaseHelper.orders);
    rvOrder.setAdapter(myAdapter);
}

最后一步需要将
firebaseheloper.orders
public,并且可能有些变量必须是
final

我在Order类中没有函数getId()。如果我定义了函数ordername,我应该返回什么?不幸的是,如果我使用for()循环,我会得到同样的错误。Order类中没有函数getId()。如果我定义了函数ordername,我应该返回什么?不幸的是,如果我使用for()循环,我会得到同样的错误。在你的问题中有一些代码。你能把它简化成吗?你的问题中有一点代码。你能把它缩小到最小吗?现在它可以工作了。仍然有一条红线显示
E/RecyclerView:未连接适配器;跳过布局
,但稍后我会找出原因。谢谢你,现在可以了。仍然有一条红线显示
E/RecyclerView:未连接适配器;跳过布局
,但稍后我会找出原因。非常感谢。