Firebase功能混淆:哪个数据库?

时间:2018-06-08 12:03:50

标签: android firebase google-cloud-firestore google-cloud-functions

我必须说实话,我根本不明白如何指定我正在与之交谈的数据库。 FireStore是否被视为一个ginourmous数据库,我的所有应用程序的文档和集合并存?

我是否必须为集合提供应用程序特定名称...说AwesomeAppUsers,ThatOtherAppUsers和AnotherAppUsers?或者是什么?只是将“/ users”下的用户混合在一起?

我正在阅读Firebase文档,我所看到的只是引用特定集合或文档的代码行,但没有引用任何名称空间或数据库。

没有设置,没有指向应该指向的位置,只需使用firebase登录,然后运行

firebase deploy --only functions

然后是魔术。

有人可以解除这个,并解释一下,当没有设置时,应用程序如何与特定功能进行通信?

最糟糕的是,当我在应用程序编写指南中看到这一点。就像这里http://resocoder.com/2018/05/25/firebase-firestore-chat-app-cloud-functions-fcm-ep-8-kotlin-android-tutorial/,两个不同的存储库,一个后端和一个应用程序......应用程序如何知道你将要编写哪些quintillion后端函数来订阅?

 return admin.messaging().sendToDevice(registrationTokens, payload).then( response => {
            const stillRegisteredTokens = registrationTokens

            response.results.forEach((result, index) => {

.sendToDevice如何不向宇宙中的所有设备发送,而只是那些专门用于应用程序的设备...再次设置在不同的存储库中...没有配置,没有指向那个。这发生在哪里?

此功能如何“知道”仅向与此相关的特定Android应用发送消息?

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into the
// Realtime Database under the path /messages/:pushId/original
exports.addMessage = functions.https.onRequest((req, res) => {
    // Grab the text parameter.
    const original = req.query.text;
    // Push the new message into the Realtime Database using the Firebase Admin SDK.
    return admin.database().ref('/messages').push({original: original}).then((snapshot) => {
        // Redirect with 303 SEE OTHER to the URL of the pushed object in the Firebase console.
        return res.redirect(303, snapshot.ref.toString());
    });
});

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
.onCreate((snapshot, context) => {
    // Grab the current value of what was written to the Realtime Database.
    const original = snapshot.val();
    console.log('Uppercasing', context.params.pushId, original);
    const uppercase = original.toUpperCase();
    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to the Firebase Realtime Database.
    // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
    return snapshot.ref.parent.child('uppercase').set(uppercase);
});

2 个答案:

答案 0 :(得分:3)

每当您在firebase中创建项目时,您需要下载名为 google-services.json 的文件。此文件类似于this

{
  "project_info": {
    "project_id": "mockproject-1234",
    "project_number": "123456789000",
    "name": "FirebaseQuickstarts",
    "firebase_url": "https://mockproject-1234.firebaseio.com"
  },

还有更多。它指定了您正在处理的项目。如果您使用firebase处理后端,同样适用,您需要使用一个特殊的配置文件,这将告诉您的本地项目它将使用哪个firebase项目。

每个firebase项目都有自己的数据库,cloud firestore或realtime,因此您当时只能更改一个数据库,即与该小文件/项目相关联的数据库。

通知和firebase中包含的所有其他内容相同。所有这些都仅限于您的项目,该项目由 google-services.json 文件指定。

当您上传云功能时,您将其上传到特定项目,这将使它们与该项目的设备一起工作,通常该项目的设备具有与此类项目相关联的google-services.json文件。

答案 1 :(得分:1)

  

.sendToDevice如何不向宇宙中的所有设备发送,而只是那些专门用于应用程序的设备...再次设置在不同的存储库中...没有配置,没有指向那个。这发生在哪里?

每个Firebase客户端SDK都可让您在设备上创建注册令牌,例如智能手机上的应用。在设备上创建该令牌后,您需要将其保存在Firestore或实时数据库中的文档中。

Android上的设备注册令牌https://firebase.google.com/docs/cloud-messaging/android/client#sample-register

现在,您可以使用此令牌在Firebase功能中通过Firebase Cloud Messaging发送消息。

发送到Firebase的各个设备文档: https://firebase.google.com/docs/cloud-messaging/admin/send-messages#send_to_individual_devices