getInstance() 不适用于实时数据库中除 us-central1 之外的其他位置
Posted
技术标签:
【中文标题】getInstance() 不适用于实时数据库中除 us-central1 之外的其他位置【英文标题】:getInstance() doesn't work with other location than us-central1 in Realtime Database 【发布时间】:2021-12-14 22:51:33 【问题描述】:我正在尝试将用户凭据保存到 Firebase 实时数据库。但是,当我执行程序时,数据库不会更新。我已正确配置 Firebase 设置,因为身份验证和存储(均为 Firebase)正在工作。
build.gradle
:
dependencies
...
// Firebase SDK setup
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:28.0.1')
// Declare the dependency for the Firebase library
implementation 'com.google.firebase:firebase-storage-ktx'
implementation 'com.google.firebase:firebase-auth-ktx'
implementation 'com.google.firebase:firebase-database-ktx'
apply plugin: 'com.google.gms.google-services'
androidManifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=<NAME>>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
...
</application>
</manifest>
注册类(MWE):
class RegisterActivity : AppCompatActivity()
var selectedPhotoUri: Uri? = null
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Register UI
register_button_register.setOnClickListener
performRegister()
// Register user credentials
private fun performRegister()
val email = email_editText_register.text.toString()
val password = password_editText_register.text.toString()
// Firebase Authentication - WORKING
FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
.addOnCompleteListener
uploadImageToFirebaseStorage()
// Upload selected photo to Firebase Storage - WORKING
private fun uploadImageToFirebaseStorage()
if(selectedPhotoUri == null) return
val filename = UUID.randomUUID().toString()
val ref = FirebaseStorage.getInstance().getReference("/images/$filename")
ref.putFile(selectedPhotoUri!!)
ref.downloadUrl.addOnSuccessListener
saveUserToFirebaseDatabase(it.toString())
// Save user associated credentials to Firebase Database - NOT WORKING
private fun saveUserToFirebaseDatabase(profileImageURL: String)
val uid = FirebaseAuth.getInstance().uid ?: ""
val ref = Firebase.database.getReference("/users/$uid")
val user = User(uid, username_editText_register.text.toString(), profileImageURL)
ref.setValue(user)
// User credentials to be saved
class User(val uid: String, val username: String, val profileImageURL: String)
saveUserToFirebaseDatabase()
方法没有被执行?我在插入onSuccessListener
和onFailureListener
语句后检查了logcat
,但是没有突出显示错误或调试信息。该应用程序。将图像推送到存储,但数据库未更新。它仍然是空的。工作流程如下:
- Authenticate user by email and password. - WORKING
- Save profile image in Storage. - WORKING
- Save profile identifier, username, and image in DB. - NOT WORKING
Firebase 数据库规则:
"rules":
".read": "true",
".write": "true"
我尝试更改层次结构,但也没有用:
val uid = FirebaseAuth.getInstance().uid ?: ""
val ref = Firebase.database.getReference("/users/$uid")
val user = User(uid, username_edittext_register.text.toString(), profileImageUrl)
ref.child("users").child(uid).setValue(user)
我已阅读 Firebase 文档,一切似乎都已就绪。我也禁用了我的防火墙,但这也不起作用。有人可以在这里指出问题吗?提前谢谢你。
【问题讨论】:
您是否尝试将完整的侦听器附加到.setValue(user)
以查看是否有问题?除此之外,您的数据库位置在哪里?
是的,我有。 saveUserToFirebaseDatabase()
方法中甚至都没有触发任何侦听器,这很可疑。 DB 位置是“europe-west1”,因为我在伦敦。
【参考方案1】:
要获取对(默认)“us-central1”以外的 Firebase 实时数据库的引用,例如“europe-west1”,您必须将数据库 URL 传递给 getInstance() 方法。
对于“us-central1”,不需要这样做,您可以简单地调用“getInstance()”方法而不传递任何参数。
有关更多信息,请查看有关实时数据库位置的官方文档:
https://firebase.google.com/docs/projects/locations#rtdb-locations作为替代解决方案,您可以从 Firebase 控制台下载最新的 google-services.json
并将其添加到您的应用中。如果该位置的正确 URL 在那里,当您调用 FirebaseDatabase.getInstance()
而不传递任何参数时,SDK 将从那里读取它。
【讨论】:
你的救生员。干杯。以上是关于getInstance() 不适用于实时数据库中除 us-central1 之外的其他位置的主要内容,如果未能解决你的问题,请参考以下文章
getInstance() 不适用于实时数据库中除 us-central1 之外的其他位置