Android 将文本数据上载到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

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

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:任务尚未完成