正在将文本数据上载到firebase实时数据库



我正试图根据本教程使用firebase构建一个实时聊天应用程序。根据教程,这行代码

mDatabaseReference.child(MESSAGES_CHILD).child(key!!).setValue(message)    

应该将消息对象中的数据写入数据库。

一切都很好,除了当用户按下发送按钮时,文本没有上传到数据库(但正在创建一个密钥,当我手动在数据库中搜索该密钥时,该密钥仅为null(。

这是ChatActivity.kt的最小代码

private const val TAG = "ChatActivity"
const val MESSAGES_CHILD = "messages"
class ChatActivity : AppCompatActivity() {
private lateinit var mChatAdapter: ChatAdapter
private lateinit var mLinearLayoutManager: LinearLayoutManager
private lateinit var mDatabaseReference: DatabaseReference
private lateinit var mFirebaseAuth: FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_chat)

mFirebaseAuth = FirebaseAuth.getInstance()
Log.d(TAG, "onCreate: n Auth: $mFirebaseAuth")
mDatabaseReference = FirebaseDatabase.getInstance().reference
mLinearLayoutManager = LinearLayoutManager(this)
mChatAdapter = ChatAdapter(options)
//ChatAdapter extends FirebaseRecyclerAdapter
chat.apply {  //R.id.chat
setHasFixedSize(true)
layoutManager = mLinearLayoutManager
adapter = mChatAdapter
}
send_button.setOnClickListener {
val message = Message(message_entry.text.trim().toString())
Log.d(TAG, "onCreate: n $message")
val key = mDatabaseReference.child(MESSAGES_CHILD).push().key
Log.d(TAG, "onCreate: n Key: $key")
mDatabaseReference.child(MESSAGES_CHILD). child(key!!).setValue(message)
}
}
override fun onPause() {
mChatAdapter.stopListening()
Log.d(TAG, "onPause: ")
super.onPause()
}
override fun onResume() {
super.onResume()
Log.d(TAG, "onResume: ")
mChatAdapter.startListening()
}
}
@IgnoreExtraProperties
data class Message(var text: String?= "", var name: String?= "", var id: String?= "") {
override fun toString(): String {
return "Text: $text n Name: $name n Id: $id"
}
}

以下是应用程序调试详细信息

2020-10-17 11:18:34.294 5168-5168/com.skb.skara D/ChatActivity: onCreate:  
Auth: com.google.firebase.auth.internal.zzn@5a3e651  
2020-10-17 11:18:34.338 5168-5168/com.skb.skara D/ChatActivity: onResume:  
2020-10-17 11:18:34.389 5168-5168/com.skb.skara D/ChatAdapter:     getItemCount: 0  
2020-10-17 11:18:34.389 5168-5168/com.skb.skara D/ChatAdapter: getItemCount: 0  
2020-10-17 11:18:37.435 5168-5168/com.skb.skara D/ChatAdapter: getItemCount: 0  
2020-10-17 11:18:37.435 5168-5168/com.skb.skara D/ChatAdapter: getItemCount: 0  
2020-10-17 11:18:42.033 5168-5168/com.skb.skara D/ChatActivity: onCreate:  
Text: Hi  
Name:  
Id:  
2020-10-17 11:18:42.033 5168-5168/com.skb.skara D/ChatActivity: onCreate:  
Key: -MJp5_ulT4U6cXU9Eu41  
2020-10-17 11:18:42.056 5168-5168/com.skb.skara D/ChatAdapter: getItemCount: 1  
2020-10-17 11:18:42.071 5168-5168/com.skb.skara D/ChatAdapter: getItemCount: 1  
2020-10-17 11:18:42.072 5168-5168/com.skb.skara D/ChatAdapter: getItemCount: 1_

这是我的数据库规则

{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}

试试这个:

String key = mDatabaseReference.child(MESSAGES_CHILD).push().getKey();
mDatabaseReference.child(MESSAGES_CHILD).child(key).setValue(message);

key表示消息的新id。

更新:将您的消息对象转换为地图:


String key = mDatabaseReference.child(MESSAGES_CHILD).push().getKey();
HashMap<String, Object> result = new HashMap<>();
result.put("id", message.id);
result.put("text", message.text);
result.put("time", message.time);
result.put("user_name", message.userName);
HashMap<String, Object> data = new HashMap<>();
data.put("/"+ MESSAGES_CHILD + "/" +key, result);
mDatabaseReference.updateChildren(data);

有关读取和写入实时数据库的更多信息

今天我解决了问题中所述的问题。实际的问题不在代码中,而是在我用来运行应用程序的模拟器中。这个链接提到了将firebase添加到android工作室项目的先决条件。在那我忘记验证我的模拟器上是否有谷歌播放的图像。今天,当我再次交叉验证先决条件时,我发现了问题,在解决了它之后,现在数据正在上传到firebase。

最新更新