2016-08-18 31 views
0

official documentation之后,我想在Firebase上存储一个新对象(我的Order类的实例),并且我希望它为我创建一个新的密钥。这是我在做什么:在Android上的Firebase中创建新对象

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference orders = database.getReference("orders"); 
orders.push().setValue(order); 

但是没有显示从控制台。我需要提前创建密钥orders吗?我无法从控制台手动创建,因为它显示空键无效。

Order类如下:

public class Order { 

    private final ArrayList<OrderItem> orderItems = new ArrayList<>(); 

    public ArrayList<OrderItem> getOrderItems() { 
     return orderItems; 
    } 

    public void addOrderItem(OrderItem orderItem) { 
     orderItems.add(orderItem); 
    } 

} 

编辑

根据该意见,我检查了错误,我得到:

Permission denied 

但我的访问规则:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".read": "$uid === auth.uid", 
     ".write": "$uid === auth.uid" 
     } 
    } 
    } 
} 

因此,该规则应该只适用于users密钥,而不适用于orders密钥。对于其他密钥,默认规则应适用:

默认规则要求身份验证。它们允许对应用程序的已认证用户进行完整的读写访问。

我的用户通过身份验证,所以为什么这不起作用在我的情况?我如何确保用户的身份验证正确?

在任何情况下,改变了访问规则:

{ 
    "rules": { 
    "orders": { 
     ".read": "auth != null", 
     ".write": "auth != null" 
    }, 
    "users": { 
     "$uid": { 
     ".read": "$uid === auth.uid", 
     ".write": "$uid === auth.uid" 
     } 
    } 
    } 
} 

不解决问题。

+2

是您的[security rul (https://firebase.google.com/docs/database/security/)设置为允许访问?默认规则只允许通过身份验证的用户访问。 –

+1

要检测这是否是问题,请在您的'setValue()'调用中添加一个完成监听器。请参阅[向Android写入值时检测错误](http://stackoverflow.com/documentation/firebase/5548/how-do-i-listen-for-errors-when-accessing-the-database#t=201608190142309558745)例如 –

+0

@qbix我正在使用默认安全规则,但用户已通过身份验证。 – manfcas

回答

1

Firebase不支持序列化Arraylists。您应该改用List或Map。
支持的数据类型有:

  • 字符串
  • 布尔
  • 地图<字符串,对象>
  • 列表<对象>

你混淆了默认的规则与适用于某一特定的访问默认规则数据库:

注:访问是默认不允许的。如果在路径上或以上没有指定.write或.read规则,则访问将被拒绝。
官方火力地堡文档


要检查用户是否登录,您可以使用来自文档此代码段:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
if (user != null) { 
    // User is signed in 
} else { 
    // No user is signed in 
} 

或者你可以使用一个监听器得到信息关于AuthState的更改:

mAuthListener = new FirebaseAuth.AuthStateListener() { 
    @Override 
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
     FirebaseUser user = firebaseAuth.getCurrentUser(); 
     if (user != null) { 
      // User is signed in 
      Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
     } else { 
      // User is signed out 
      Log.d(TAG, "onAuthStateChanged:signed_out"); 
     } 
     // ... 
    } 
};