【问题标题】:FireBase Database Exception while uploading values上传值时 FireBase 数据库异常
【发布时间】:2016-11-20 22:43:34
【问题描述】:

在运行 logcat 时出现以下错误: E/AndroidRuntime: 致命异常: main 进程:com.example.shikh.regie,PID:19366 com.google.firebase.database.DatabaseException:无法使用类 com.example.shikh.regie.User 解析节点 在 com.google.android.gms.internal.zzamm.zza(未知来源) 在 com.google.android.gms.internal.zzamm.zzbt(未知来源) 在 com.google.android.gms.internal.zzamp.zzbu(未知来源) 在 com.google.firebase.database.DatabaseReference.setValue(未知来源) 在 com.example.shikh.regie.MainActivity$1.onClick(MainActivity.java:40)

不知道是什么问题。为什么无法解析节点

MainActivity.java

public class MainActivity extends AppCompatActivity {
private EditText name,email,phone;
private Button btn;
private DatabaseReference mDatabse;
private String name1,email1,phone1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mDatabse = FirebaseDatabase.getInstance().getReference().child("AppUsers");

    name = (EditText) findViewById(R.id.editText);
    email = (EditText) findViewById(R.id.editText2);
    phone = (EditText) findViewById(R.id.editText3);

    name1 = name.getText().toString();
    email1 = email.getText().toString();
    phone1 = phone.getText().toString();
    btn = (Button) findViewById(R.id.button);
         btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Map<String, User> users = new HashMap<String, User>();
            DatabaseReference ref=mDatabse.child("AppUsers");
            mDatabse.setValue(email1,new User(name1,email1,phone1));
            mDatabse.setValue(users);
        }
    });

}
}

User.java

package com.example.shikh.regie;


public class User {
String name,email,phone;

public User(){}

public User(String name, String email, String phone) {
    this.name = name;
    this.email = email;
    this.phone = phone;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPhone() {
    return phone;
}

public void setPhone(String phone) {
    this.phone = phone;
}
 }

【问题讨论】:

标签: java android firebase-realtime-database


【解决方案1】:

此代码不起作用:

mDatabse.setValue(email1,new User(name1,email1,phone1));

唯一的[匹配 setValue() 的重载](https://firebase.google.com/docs/reference/android/com/google/firebase/database/DatabaseReference.html#setValue(java.lang.Object, java.lang.Object)) 是:

public Task&lt;Void&gt; setValue (Object value, Object priority)

将数据和优先级设置为给定值。

在这个重载中,第二个参数是一个优先级值,它必须是一个原始对象。

您似乎更有可能这样做:

mDatabse.child("email1").setValue(new User(name1,email1,phone1));

这会将新用户设置为引用下的节点email1

【讨论】:

  • 我希望父节点应该被命名为用户的电子邮件...每个用户在他的父节点下都有自己的记录和他的电子邮件
  • 为此,您需要在上面的 sn-p 中指定电子邮件地址而不是 email1。请务必对电子邮件进行编码,因为 Firebase 密钥中不允许使用 .。常见的方法是将. 替换为,
  • 注意:电子邮件地址可以包含许多 Firebase 密钥中不允许的字符。使用电子邮件作为密钥也不允许用户更改他们的电子邮件地址。为了解决这两个问题,我使用 UUID 存储用户。在我的应用程序启动时,我只是通过电子邮件地址将内存中的所有用户加载到哈希映射中。
  • @bluevoid Firebase 键中不允许使用的字符集非常小,其中大多数不能出现在电子邮件地址上。据我所知,点. 确实是我们唯一编码的。将所有用户加载到内存中可能会在您的应用启动时起作用,但如果/当您拥有数千/数百万用户时,就会成为可扩展性瓶颈。
  • 好吧,这不是真正的大集合:firebase 字段名中不允许:.$[]#/ 电子邮件中允许:!#$%&'*+-/=?^_`{|} 〜;和 [] 在引号之间是允许的。因此,要获得完全覆盖,您需要更换所有这些。请参阅此处的讨论:grokbase.com/t/gg/firebase-talk/154q27rryc/…。他们的解决方案是对电子邮件进行 urlencode 并替换点。当超过几千个时,加载所有用户将成为瓶颈,这是真的。
猜你喜欢
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多