我在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 */
答案 0 :(得分:1)
我的问题是,存储数据的最佳方法是什么?如何实现该最佳方法?
如果要将数据保留在手机中,可以尝试使用SQLite或Room Persistence Library,在这里您可以根据向我们展示的结构定义数据库,并可以查询存储的文档
这样,在首次获取文档后,您可以将其存储在数据库中。在将来尝试获取它时,应首先检查它是否存储在数据库中。如果不是,则可以继续从Firestore获取(并将其保存在本地)。
我用来在本地存储和持久存储数据的另一资源是通过Android Shared Preferences。恕我直言,它不如使用SQLite或Room复杂,但是它对于复杂的数据结构(AFAIK,它只能存储原始数据和StringSet)具有局限性。好消息是您可以将文档另存为JSON字符串,并将其轻松存储在您的“共享首选项”中(实际上,文档的结构确实适合JSON格式,因为它具有地图,数组等)。
如果使用此方法,则遵循相同的原则,然后在必须从Firestore抓取文档之前检查“共享首选项”是否存在。