android - 如何将文档快照(复杂对象)保存到共享首选项或文件?

标签 android firebase kotlin google-cloud-firestore gson

我需要保存来自 firestore 查询的最后一个文档快照。我试图将此文档快照保存到 Android 上的共享首选项,但我总是崩溃。

我尝试使用以下这些方法保存并获取文档快照,来自 store and retrieve a class object in shared preference :

fun saveLastDocumentAttendedEvents(lastDocument: DocumentSnapshot) {

        val json = gson.toJson(lastDocument)
        with(sharedPref.edit()) {
            putString("LAST_DOCUMENT_ATTENDED_EVENTS", json)
            apply()
        }

    }


    fun loadLastDocumentAttendedEvents() : DocumentSnapshot?  {
        val json = sharedPref.getString("LAST_DOCUMENT_ATTENDED_EVENTS", "")
        return gson.fromJson(json, DocumentSnapshot::class.java)
    }

我通常可以使用这些方法毫无问题地将自定义对象保存到共享首选项,但是如果将 DocumentSnaphot 保存到共享首选项并出现错误消息,它总是会崩溃:

at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97) 2019-09-29 11:35:07.036 15370-15370/com.muchammadagunglaksana.kumpul_muslim E/AndroidRuntime: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)

我需要将其保存在共享首选项、文件等中以保留来自 firestore 查询的最后一个文档

最佳答案

理想情况下,您可以使用 firebase 自己的缓存系统,而不是实现自己的缓存。

要启用它你应该使用

val settings = FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(true)
        .build()
db.firestoreSettings = settings

通过启用此功能,即使您的应用处于离线状态,Firebase 也会返回该查询的最后处理结果。

即便如此,如果您想使用自己的缓存系统,我还是建议您从 sanpshot 类中获取值并保存它,而不是保存整个快照。

此处示例 Kotlin Gson Deserializing

关于android - 如何将文档快照(复杂对象)保存到共享首选项或文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58152295/

相关文章:

java - 这个for循环有什么问题?

firebase - 谷歌应用程序邀请 - 不发送短信

android - getContactsFromFirebase() 方法返回一个空列表

android - 如何从 Crashlytics 迁移到 Firebase Crashlyics(Firebase 项目不在列表中)

android - Android 中的默认动画在哪里?

java - R.java 文件从未生成

android - "Program type already present"是什么意思?

android - 在使用 Android NDK r10e 构建静态库时“无效使用 'auto'”

spring - Kotlin Hibernate 中删除 ManyToOne 列表类型

android - 如何使用Kotlin排除Android项目中的类