从实时数据库android获取数据时出现问题



我使用这种方法从Firebase中获取数据,一切正常,除了用户第一次安装应用程序时没有获得数据,但当应用程序重新打开时,一切都正常。我发现的问题是它没有第一次调用addListenerForSingleValueEvent

请在这方面帮助我,当用户第一次安装应用程序时,它也应该获取数据。

private fun fetchData(onComplete: ((Boolean) -> Unit)?=null) {
val database = FirebaseDatabase.getInstance().reference
var ref: DatabaseReference? = null
if (context?.packageName?.contains(".dev") == false) {
ref = database.child("sticker_packs")
} else {
ref = database.child("sticker_packs_devs")
Timber.d("it debug mode")
}
val phoneQuery = ref.orderByChild("identifier")
val firebaseList = ArrayList<StickerPack>()
phoneQuery.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (singleSnapshot in dataSnapshot.children) {
Timber.e(TAG, "onDataChange: ${singleSnapshot.child("stickers").value}")
val stickerPacks: StickerPack? = singleSnapshot.getValue<StickerPack>()
stickerspack = stickerPacks
stickers = stickerPacks
val unzipLocation = "${path}/${stickerPacks?.pack_id}"
if (stickerPacks != null) {
Timber.d("zipfilepath ${stickerPacks.zip_file}")
}
val tryIconPath = "$unzipLocation/try"
val trypath = File(tryIconPath)
val trayFile = trypath.listFiles()
var tryiconImage = ""
trayFile?.forEach {
if (it.name.contains(".png")) {
tryiconImage = it.name
}
Timber.d("try icon g $tryiconImage")
}
stickerPacks?.tray_image_file = tryiconImage
val pkg = "${Package_Head}${PACKAGE_NAME}"
stickerPacks?.publisherEmail = getString(R.string.feedback_email)
stickerPacks?.publisherWebsite = getString(R.string.privacy_policy_link)
stickerPacks?.privacyPolicyWebsite = getString(R.string.privacy_policy_link)
stickerPacks?.licenseAgreementWebsite =
getString(R.string.privacy_policy_link_1)
stickerPacks?.isWhitelisted = true
stickerPacks?.android_play_store_link = pkg
if (stickerPacks != null) {
firebaseList.add(stickerPacks)
}
}
Timber.e(TAG, "onDataChangecache: ${firebaseList.size}")
Timber.e(TAG, "arraylist1: ${firebaseList.size}")
//                val getListFromMainActivity=listDataBase
val getListFromMainActivity = Hawk.get("listfromactivity", ArrayList<StickerPack>())
Timber.d("CheckIfNull ${getListFromMainActivity.size}")
if (getListFromMainActivity.isNullOrEmpty() && getListFromMainActivity.size <= 0) {
onComplete?.invoke(false)
}else{
onComplete?.invoke(true)
context?.let {
adapter?.setData(
it, getListFromMainActivity, requireActivity(), this@StickersFragment
)
}
}
Hawk.put("sticker_packs", firebaseList)
view?.linlaHeaderProgress?.visibility = View.GONE
if (view?.linlaHeaderProgress?.visibility == View.GONE) {
//spinnerDialog()
}
Timber.e(TAG, "onDataChe0:$dataSnapshot ")
}
override fun onCancelled(databaseError: DatabaseError) {
Timber.e(TAG, "onCancelled", databaseError.toException())
}
})
}
class StickerPack : Parcelable {
var pack_id: String=""
var pack_Name: String=""
var publisher: String=""
var tray_image_file: String=""
var publisherEmail: String="" //exclude
var publisherWebsite: String="" //exclude
var privacyPolicyWebsite: String="" //exclude
var licenseAgreementWebsite: String="" //exclude
var iosAppStoreLink: String="" //exclude
private var stickers: List<Sticker>? = null
var totalSize: Long = 0
private set
var android_play_store_link: String=""
var isWhitelisted = false //exclude
var animated_sticker_pack:Boolean= false
var zip_file: String?=null
}

我的猜测是您启用了磁盘缓存,在这种情况下不应该使用addListenerForSingleValueEvent。相反,使用更新的get()方法和最新的SDK版本,并执行:

phoneQuery.get().addOnSuccessListener {
Log.i("firebase", "Got value ${it.value}")
for (singleSnapshot in it.value.children) {
Timber.e(TAG, "onDataChange: ${singleSnapshot.child("stickers").value}")
...
}
}.addOnFailureListener{
Log.e("firebase", "Error getting data", it)
}

另请参阅:

  • Firebase离线功能和addListenerForSingleValueEvent

最新更新