如何在结构复杂的本地存储Google Cloud Firestore数据?

时间:2019-06-17 19:30:14

标签: android kotlin google-cloud-firestore android-storage

我在Google Cloud Firestore上有一个数据库,并且正在Kotlin制作一个Android应用程序来访问它。该数据库只有一个集合,但是有很多文档。 一次用户只需要约5-6个文档。在线数据库的原因是将来可以轻松添加更多文档。 一旦下载,很少会下载的文档数据得到更新。 因此,下载后,我希望他们无需Internet即可访问。

我的问题是,即使文档存储在本地,要访问它们,我也必须设置一个侦听器,因为它使代码变得异步,这使事情变得非常复杂。所以我想以不同的方式将它们存储在本地,以便我可以无延迟地访问数据

这是我从缓存访问文档的方式:

val db = FirebaseFirestore.getInstance().collection("courses")
db.document("doc_name").get(Source.CACHE).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // what to write here
        // to store the data locally
        // if some other method is used ?     
    } else {
        // documents need to be re-downloaded
    }
}

我的问题是,存储数据的最佳方法是什么?如何实现该最佳方法?鉴于所有文档共享一个相似但非常复杂的结构,如下所示。

collection/doc_example/

|----string
|
|----string
|
|----map
|    |----string
|    |----int
|
|----int
|
|----array{size=3, type=int}
|
|----string
|
|----map
|    |----int
|    |----array{size=variable, type=map}
|         |----map
|              |----string
|              |----int
|              |----array{size=variable, type=string}
|
|----array{size=variable, type=string}
|
|----array{size=variable, type=string}    /* note - this array is optional */
|                                            
|----array{size=variable, type=map}
     |----map
          |----string
          |----string     
          |----int
          |----string
          |----string    /* note - this one string is optional */

1 个答案:

答案 0 :(得分:1)

  

我的问题是,存储数据的最佳方法是什么?如何实现该最佳方法?

如果要将数据保留在手机中,可以尝试使用SQLiteRoom Persistence Library,在这里您可以根据向我们展示的结构定义数据库,并可以查询存储的文档

这样,在首次获取文档后,您可以将其存储在数据库中。在将来尝试获取它时,应首先检查它是否存储在数据库中。如果不是,则可以继续从Firestore获取(并将其保存在本地)。

我用来在本地存储和持久存储数据的另一资源是通过Android Shared Preferences。恕我直言,它不如使用SQLite或Room复杂,但是它对于复杂的数据结构(AFAIK,它只能存储原始数据和StringSet)具有局限性。好消息是您可以将文档另存为JSON字符串,并将其轻松存储在您的“共享首选项”中(实际上,文档的结构确实适合JSON格式,因为它具有地图,数组等)。

如果使用此方法,则遵循相同的原则,然后在必须从Firestore抓取文档之前检查“共享首选项”是否存在。