Android 将文本数据上载到firebase实时数据库
根据教程,我正在尝试使用firebase构建一个实时聊天应用程序。根据教程,这行代码Android 将文本数据上载到firebase实时数据库,android,firebase,android-studio,kotlin,firebase-realtime-database,Android,Firebase,Android Studio,Kotlin,Firebase Realtime Database,根据教程,我正在尝试使用firebase构建一个实时聊天应用程序。根据教程,这行代码 mDatabaseReference.child(MESSAGES_CHILD).child(key!!).setValue(message) 应将消息对象中的数据写入数据库 一切正常,除了用户按下发送按钮时,文本没有上传到数据库(但正在创建一个键,当我在数据库中手动搜索该键时,该键仅存储在那里为空) 以下是ChatActivity.kt的最低代码 private const val TAG = &q
mDatabaseReference.child(MESSAGES_CHILD).child(key!!).setValue(message)
应将消息对象中的数据写入数据库
一切正常,除了用户按下发送按钮时,文本没有上传到数据库(但正在创建一个键,当我在数据库中手动搜索该键时,该键仅存储在那里为空)
以下是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"
}
}
这是我的数据库规则
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);
键
表示消息的新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);
String key=mDatabaseReference.child(MESSAGES_child).push().getKey();
HashMap结果=新建HashMap();
结果.put(“id”,message.id);
结果.put(“text”,message.text);
结果.put(“time”,message.time);
结果.put(“用户名”,message.userName);
HashMap数据=新的HashMap();
数据输入(“/”+消息\子项+“/”+键,结果);
mDatabaseReference.updateChildren(数据);
有关导入实时数据库的详细信息,请尝试以下操作:
String key = mDatabaseReference.child(MESSAGES_CHILD).push().getKey();
mDatabaseReference.child(MESSAGES_CHILD).child(key).setValue(message);
键
表示消息的新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);
String key=mDatabaseReference.child(MESSAGES_child).push().getKey();
HashMap结果=新建HashMap();
结果.put(“id”,message.id);
结果.put(“text”,message.text);
结果.put(“time”,message.time);
结果.put(“用户名”,message.userName);
HashMap数据=新的HashMap();
数据输入(“/”+消息\子项+“/”+键,结果);
mDatabaseReference.updateChildren(数据);
有关实时数据库的更多信息今天,我解决了问题中所述的问题。实际问题不在代码中,而是在我用来运行应用程序的模拟器中。链接提到了将firebase添加到android studio项目的先决条件。因为我忘了验证我的模拟器上是否有google play图像。今天,当我再次交叉验证先决条件时,我发现了问题,解决后,现在数据将上载到firebase。今天,我解决了问题中所述的问题。实际问题不在代码中,而是在我用来运行应用程序的模拟器中。链接提到了将firebase添加到android studio项目的先决条件。因为我忘了验证我的模拟器上是否有google play图像。今天,当我再次交叉验证先决条件时,我发现了问题,解决后,现在数据将上载到firebase。密钥已创建。但那个位置并没有存储任何东西。现在我尝试了这种方法,但遗憾的是,这种方法也不起作用。我访问了您提供的链接,我的message类满足此处给出的将数据写入firebase数据库的要求。在更新子项后使用
addOnSuccessListener
,addOnCompleteListener
,addOnFailureListener
并记录一些内容。比如mDatabaseReference.updateChildren(数据)。addOnSuccessListener()。addOnCompleteListener()。addOnFailureListener()
我添加了所有4个可用的侦听器(成功、失败、完成、取消),但它们都没有出现在logcat中。当我通过setValue(message).getResult()
请求任务的结果时,由于出现致命异常,程序暂停,称为java.lang.IllegalStateException:task尚未完成。创建了密钥。但那个位置并没有存储任何东西。现在我尝试了这种方法,但遗憾的是,这种方法也不起作用。我访问了您提供的链接,我的message类满足此处给出的将数据写入firebase数据库的要求。在更新子项后使用addOnSuccessListener
,addOnCompleteListener
,addOnFailureListener
并记录一些内容。比如mDatabaseReference.updateChildren(数据)。addOnSuccessListener()。addOnCompleteListener()。addOnFailureListener()
我添加了所有4个可用的侦听器(成功、失败、完成、取消),但它们都没有出现在logcat中。当我通过setValue(message).getResult()
请求任务的结果时,由于出现致命异常,程序暂停,称为java.lang.IllegalStateException:任务尚未完成