Cloud Firestore + Android只是

不久前,Google推出了Cloud Firestore。 Cloud Firestore是基于云的NoSQL数据库,谷歌将其定位为实时数据库的替代品。 在本文中,我想告诉您如何开始使用它。


可能性


Cloud Firestore允许您将数据存储在远程服务器上,轻松访问它并实时监视更改。 该文档对Cloud Firestore和实时数据库进行了很好的比较。


创建并连接到项目


在Firebase控制台中,选择“数据库”,然后单击“创建数据库”。 接下来,选择访问设置。 为了熟悉,测试模式对我们来说足够了,但是在生产上,最好更认真地解决这个问题。 在此处阅读有关访问模式的更多信息。



要配置项目,请执行以下步骤:


  1. 根据此处的说明将Firebase添加到项目中
  2. 将依赖项添加到app / build.gradle
    implementation 'com.google.firebase:firebase-firestore:18.1.0'

现在一切就绪。


为了熟悉使用Cloud Firestore的基本技术,我编写了一个简单的应用程序 。 要工作,您需要在Firebase控制台中创建一个项目,并将google-services.json文件添加到Android Studio中的项目中。


数据存储结构


Firestore使用集合和文档来存储数据。 文档是包含任何字段的记录。 文件被合并到集合中。 文档也可能包含嵌套集合,但这在android上不受支持。 如果我们用SQL数据库做一个类比,则集合是一个表,文档是该表中的一个条目。 一个集合可能包含具有不同字段集的文档。


接收和记录数据


为了获取集合的所有文档,以下代码就足够了


 remoteDB.collection(“Tasks”) .get() .addOnSuccessListener { querySnapshot -> //   .   querySnapshot.documents } .addOnFailureListener { exception -> //      } } 

在这里,我们要求Tasks集合中的所有文档。


该库允许您使用参数生成查询。 以下代码显示如何按条件从集合中获取文档


 remoteDB.collection(“Tasks”) .whereEqualTo("title", "Task1") .get() .addOnSuccessListener { querySnapshot -> //   .   querySnapshot.documents } .addOnFailureListener { exception -> //      } } 

在这里,我们从Tasks集合中请求所有文档,这些文档的标题字段与Task1的值相对应。


收到文件后,可以立即将其转换为我们的数据类


 remoteDB.collection(“Tasks”) .get() .addOnSuccessListener { querySnapshot -> //   .   querySnapshot.documents val taskList: List<RemoteTask> = querySnapshot.toObjects(RemoteTask::class.java) } .addOnFailureListener { exception -> //      } } 

要进行编写,您需要创建一个带有数据的Hashmap(其中,字段名充当键,而该字段的值充当值),并将其传输到库中。 以下代码演示了这一点


 val taskData = HashMap<String, Any>() taskData["title"] = task.title taskData["created"] = Timestamp(task.created.time / 1000, 0) remoteDB.collection("Tasks") .add(taskData) .addOnSuccessListener { //   } .addOnFailureListener { //     } 

在此示例中,将创建一个新文档,Firestore将为其生成ID。 要设置自己的ID,请执行以下操作


 val taskData = HashMap<String, Any>() taskData["title"] = task.title taskData["created"] = Timestamp(task.created.time / 1000, 0) remoteDB.collection("Tasks") .document("New task") .set(taskData) .addOnSuccessListener { //   } .addOnFailureListener { //     } 

在这种情况下,如果没有id等于New task的文档,则将创建该文档,如果存在,则将更新指定的字段。


创建/更新文档的另一种选择


 remoteDB.collection("Tasks") .document("New task") .set(mapToRemoteTask(task)) .addOnSuccessListener { //   } .addOnFailureListener { //     } 

订阅变更


Firestore允许您订阅数据更改。 您可以订阅对集合的更改以及对特定文档的更改


 remoteDB.collection("Tasks") .addSnapshotListener { querySnapshot, error -> // querySnapshot -   // error -  } 

querySnapshot.documents-包含所有文档的更新列表
querySnapshot.documentChanges-包含更改列表。 每个对象都包含一个修改后的文档和更改类型。 可能有3种变化
已添加-已添加文档,
已修改-文档已更改,
已删除-文档已删除


加载大量数据


实时数据库为下载大量数据提供了一种不太方便的机制,该机制包括手动编辑json文件并下载。 Firestore开箱即用,不提供任何此类服务。 在我找到一种轻松加载大量信息的方法之前,添加新文档非常不方便。 为了使您不会遇到像我这样的问题,下面我将附上有关如何快速轻松地下载大量数据的说明。 该说明在Internet上找到。


  1. 安装Node.js和npm
  2. 通过运行命令安装firebase-admin软件包
    npm install firebase-admin --save
  3. 生成具有收集数据的json文件。 可以在Tasks.json文件中找到一个示例
  4. 要下载,我们需要访问密钥。 如何获得它在本文中有很好的描述
  5. 在文件export.js中放下您的数据
    require('./ firestore_key.json')-具有访问密钥的文件。 我在一个带脚本的文件夹中
    <YOU_DATABASE>-您的Firestore基地名称
    “ ./json/Tasks.json”-数据所在文件的路径
    ['created']-类型为时间戳的字段名称列表
  6. 执行脚本
    node export.js
    该脚本使用了dalenguyen的发展

结论


我在其中一个项目中使用Cloud Firestore,但没有遇到任何严重问题。 我的一个收藏集中包含大约15,000个文档,并且对其的查询非常快,而且没有使用索引。 将Cloud Firestore与Room和Remote Config结合使用,您可以大大减少对数据库的调用次数,并且不会超出免费限制。 以每天免费的费用,您可以阅读50,000文档,记录20,000和删除20,000。


应用性能

Source: https://habr.com/ru/post/zh-CN447640/


All Articles