- 版本: 3.2.9
- GitHub: https://github.com/NativeScript/firebase
- NPM: https://npmjs.net.cn/package/%40nativescript-asharghi%2Ffirebase-database
- 下载
- 昨日: 1
- 上周: 2
- 上月: 14
@nativescript-asharghi/firebase-database
简介
一个插件,允许您将 Firebase 实时数据库 添加到您的 NativeScript 应用程序中。
注意:使用此插件与 @nativescript-asharghi/firebase-core 插件一起初始化 Firebase。NativeScript Firebase 提供与 Android 和 iOS Firebase SDK 的集成,支持实时数据同步和离线功能。
安装
在项目根目录中运行以下命令以安装插件。
npm install @nativescript-asharghi/firebase-database
使用 @nativescript-asharghi/firebase-database
注意: Firebase 文档 提供了如何结构化数据的最佳实践的示例。我们强烈建议在构建数据库之前阅读指南。
导入插件
通过在 app.ts
文件中一次性导入,将实时数据库 SDK 使您的应用程序可用。
import '@nativescript-asharghi/firebase-database'; // only needs to be imported 1x
创建数据库实例
要创建新的 Firebase 数据库实例,请在 firebase 实例上调用 database
方法,如下所示
import { firebase } from '@nativescript-asharghi/firebase-core';
const database = firebase().database();
默认情况下,这允许您使用在平台上安装 Firebase 时使用的默认 Firebase App 与 Firebase 数据库交互。但是,如果您想使用辅助 Firebase App,则在调用数据库方法时传递辅助 app 实例
import { firebase } from '@nativescript-asharghi/firebase-core';
import '@nativescript-asharghi/firebase-database';
// create secondary app instance
const config = new FirebaseOptions();
const secondaryApp = firebase.initializeApp(config, 'SECONDARY_APP');
const database = firebase().database(secondaryApp);
获取或创建引用
理解实时数据库的一个核心概念是引用 - 对数据库中特定节点的引用。节点可以是一个特定的属性或子节点。
要创建一个 引用,请在数据库实例上调用 ref
方法,并传递引用的路径
import { firebase } from '@nativescript-asharghi/firebase-core';
const reference = firebase().database().ref('/users/123');
读取引用数据
您可以通过两种方式读取引用数据:一次性或当引用及其子项发生变化时。
一次性读取
要一次性读取值,请在引用上调用 once
方法,并传递 value
事件名称
import { firebase } from '@nativescript-asharghi/firebase-core';
firebase()
.database()
.ref('/users/123')
.once('value')
.then((snapshot) => {
console.log('User data: ', snapshot.val());
});
监听引用的实时变化
要设置活动监听器以响应节点及其子项的任何更改,请调用 on
方法,将其 value
事件作为第一个参数,并将事件处理程序作为第二个参数
import { firebase } from '@nativescript-asharghi/firebase-core';
firebase()
.database()
.ref('/users/123')
.on('value', (snapshot) => {
console.log('User data: ', snapshot.val());
});
事件处理程序将立即调用快照数据,并在节点发生任何更改时进一步调用。
监听引用子项的事件
要监听引用子节点的以下事件,请在引用上调用on
方法,将事件名称作为第一个参数,将事件处理程序作为第二个参数。将事件名称传递给on
方法作为第一个参数,将上面示例中的事件处理程序作为第二个参数。该示例演示了如何订阅节点内值变化时的事件。在某些情况下,你可能只需要在子节点发生变化时订阅事件。
子节点添加
子节点更改
子节点删除
_子节点移动
如果你正在监听具有许多子节点的节点,只监听你关心的数据可以帮助减少网络带宽并加快你的应用程序。
import { firebase } from '@nativescript-asharghi/firebase-core';
const onChildAdd = firebase()
.database()
.ref('/users')
.on('child_added', (snapshot) => {
console.log('A new node has been added', snapshot.val());
});
// Stop listening for updates when no longer required
firebase().database().ref('/users').off('child_added', onChildAdd);
移除引用事件监听器
要取消订阅事件,请调用引用上的off
方法,将事件名称和on
方法返回的函数传递给它。这可以在任何useEffect钩子中使用,以便在钩子需要取消订阅自身时自动取消订阅。
import { firebase } from '@nativescript-asharghi/firebase-core';
const onValueChange = firebase()
.database()
.ref(`/users/${userId}`)
.on('value', (snapshot) => {
console.log('User data: ', snapshot.val());
});
// Stop listening for updates when no longer required
firebase().database().ref(`/users/${userId}`).off('value', onValueChange);
数据查询
实时数据库支持对数据的简单查询。当引用节点包含子节点时,你可以对返回的结果进行排序和限制。
如果你的应用程序需要更高级的查询功能,建议使用Cloud Firestore。有关可用的查询API,请参阅查询类。
排序数据
默认情况下,结果根据节点键进行排序。但是,如果你正在使用自定义键,你可以通过调用一个orderBy*
方法对一个查询实例来排序你的数据。
例如,如果所有子节点都是标量值(字符串、数字或布尔值),你可以使用orderByValue
方法,Firebase将自动排序结果。下面的示例将返回def
节点在abc
节点之前。
import { firebase } from '@nativescript-asharghi/firebase-core';
/*
* {
* 'scores': {
* 'abc: 30,
* 'def': 50,
* }
* }
*/
const scores = await firebase().database().ref('scores').orderByValue().once('value');
请注意,如果你不使用DataSnapshot上提供的forEach方法,排序将不被尊重。
scores.forEach((snapShot)=>{
// do someting
})
限制结果数量
你可以通过使用一个limitTo*
方法来限制查询返回的结果数量。例如,要限制前10个结果,你可以在引用上调用limitToFirst(10)
。
import { firebase } from '@nativescript-asharghi/firebase-core';
const users = firebase().database().ref('users').limitToFirst(10).once('value');
Firebase还提供了通过limitToLast
方法返回查询中的最后一批结果的能力。
你可以通过从特定参考节点值开始或结束来限制特定数量的文档,而不是限制到特定数量的文档。
import { firebase } from '@nativescript-asharghi/firebase-core';
await firebase().database().ref('users').orderByChild('age').startAt(21).once('value');
写入数据
你可以使用set
或update
方法将数据写入引用。
设置数据
在引用上调用set
方法会覆盖该引用节点上现有的所有数据。值可以是任何东西;字符串、数字、对象等。
import { firebase } from '@nativescript-asharghi/firebase-core';
firebase()
.database()
.ref('/users/123')
.set({
name: 'Ada Lovelace',
age: 31,
})
.then(() => console.log('Data set.'));
如果你将值设置为null
,Firebase将自动将节点标记为已删除,并将其从数据库中删除。
更新数据
而不是覆盖所有现有数据,update
方法更新引用节点上现有的任何数据。Firebase将根据当前存在的内容自动合并数据。
import { firebase } from '@nativescript-asharghi/firebase-core';
firebase()
.database()
.ref('/users/123')
.update({
age: 32,
})
.then(() => console.log('Data updated.'));
生成新的子引用
要为引用生成一个新的子引用,请调用引用上的push
方法,可选地传递要存储的值。push
方法自动生成一个新的键。要存储子引用中的值,请调用set
方法,传递要存储的值。
import { firebase } from '@nativescript-asharghi/firebase-core';
const newReference = firebase().database().ref('/users').push();
console.log('Auto generated key: ', newReference.key);
newReference
.set({
age: 32,
})
.then(() => console.log('Data updated.'));
生成的键是按照当前时间排序的,因此从Firebase返回的项目列表将默认按时间顺序排序。
从引用中删除数据
要从引用中删除数据,请调用引用上的remove
方法。
import { firebase } from '@nativescript-asharghi/firebase-core';
await firebase().database().ref('/users/123').remove();
可选地,你也可以将引用节点的值设置为null,以将其从数据库中删除。
import { firebase } from '@nativescript-asharghi/firebase-core';
await firebase().database().ref('/users/123').set(null);
将数据作为事务保存
事务是始终确保写入发生时服务器上最新的信息可用的一种方式。事务永远不会部分应用写入,并且所有写入都在事务成功结束时执行。
想象一个场景,一个应用可以“点赞”用户的帖子。每当用户点击“点赞”按钮时,数据库中的/likes/:postId
值(点赞数)会递增。如果没有事务,我们需要先读取现有值,然后对两个不同的操作进行递增。
在高流量的应用中,当操作设置新值时,服务器上的值可能已经改变,导致实际数量不一致。
事务通过原子地更新服务器上的值来解决这个问题。如果在事务执行过程中值发生变化,它会重试。这始终确保使用服务器上的值而不是客户端值。
要执行新事务,请调用引用上的transaction
方法。
import { firebase } from '@nativescript-asharghi/firebase-core';
function onPostLike(postId) {
const reference = firebase().database().ref(`/likes/${postId}`);
// Execute transaction
return reference.transaction((currentLikes) => {
if (currentLikes === null) return 1;
return currentLikes + 1;
});
}
// When post "567" is liked
onPostLike('567').then((transaction) => {
console.log('New post like count: ', transaction.snapshot.val());
});
API
数据库类
数据库类有以下成员。
属性
属性 | 类型 | 描述 |
---|---|---|
android |
com.google.firebase.database.FirebaseDatabase | Android的只读数据库实例。 |
ios |
FIRDatabase | iOS的只读数据库实例。 |
app |
FirebaseApp |
只读 |
persistenceCacheSizeBytes |
数字 |
|
persistenceEnabled |
布尔值 |
方法
方法 | 返回值 | 描述 |
---|---|---|
constructor(app?: FirebaseApp) |
void |
创建Firebase实时数据库实例。 |
useEmulator(host: string, port: number) |
void |
关于描述,请参阅Firebase文档中的useEmulator。 |
refFromURL(url: string) |
引用 | 关于描述,请参阅Firebase文档中的refFromURL。 |
setLoggingEnabled(enabled: boolean) |
void |
|
ref(path?: string) |
引用 | 返回一个引用实例。 |
goOffline() |
void |
关于描述,请参阅Firebase文档中的goOffline。 |
goOnline() |
void |
关于描述,请参阅Firebase文档中的goOnline。 |
引用类
引用类有以下属性
属性
属性 | 类型 | 描述 |
---|---|---|
android |
com.google.firebase.database.Reference | 引用类的只读原生Android实例。 |
ios |
FIRDatabaseReference | 引用类的只读原生iOS实例。 |
key |
字符串 |
只读。关于描述,请参阅Firebase文档中的key。 |
parent |
引用 |
只读。关于描述,请参阅Firebase文档中的parent。 |
ref |
引用 |
只读。关于描述,请参阅Firebase文档中的ref。 |
root |
引用 |
只读。关于描述,请参阅Firebase文档中的root。 |
方法
引用类有以下方法
方法 | 返回值 |
---|---|
child(path: string) |
引用 |
onDisconnect() |
OnDisconnect |
push(value?: any, onComplete?: () => void) |
IThenableReference |
remove(onComplete?: (error: FirebaseError) => void) |
Promise<void> |
set(value: any, onComplete?: (error: FirebaseError) => void) |
Promise<void> |
`setPriority(priority: string | number, onComplete?: (error: FirebaseError) => void)` |
`setWithPriority(newVal: any, newPriority: string | number, onComplete?: (error: FirebaseError) => void)` |
transaction(transactionUpdate: (currentData: object) => object, onComplete?: (error: FirebaseError, committed: boolean, finalResult: any) => void, applyLocally: boolean = true) |
Promise<TransactionResult> |
update(values: { [key: string]: any }, onComplete?: (error: FirebaseError) => void) |
Promise<void> |
断开连接类
属性
属性 | 类型 | 描述 |
---|---|---|
android |
com.google.firebase.database.OnDisconnect | 只读 |
ios |
FIRDatabaseReference | 只读 |
方法
方法 | 返回值 | 描述 |
---|---|---|
cancel(onComplete?: (error: FirebaseError) => void) |
Promise<void> |
关于描述,请参阅Firebase文档中的cancel。 |
remove(onComplete?: (error: FirebaseError) => void) |
Promise<void> |
关于描述,请参阅Firebase文档中的remove。 |
set(value: any, onComplete?: (error: FirebaseError) => void) |
Promise<void> |
关于描述,请参阅Firebase文档中的set。 |
设置优先级(value: any, priority: string) | number, onComplete?: (error: FirebaseError) => void)` | Promise<void> |
update(values: { [key: string]: any }, onComplete?: (error: FirebaseError) => void) |
Promise<void> |
有关说明,请参阅Firebase文档中的update。 |
查询类
属性
属性 | 类型 | 描述 |
---|---|---|
android |
com.google.firebase.database.Query | Query类的只读Android实例。 |
ios |
FIRDatabaseQuery | Query类的只读iOS实例。 |
ref |
引用 | 指向Query位置的Reference实例。 |
方法
方法 | 返回值 | 描述 |
---|---|---|
`endAt(value: string | 数字 | boolean, key?: string)` |
`equalTo(value: string | 数字 | boolean, key?: string)` |
keepSynced(bool: boolean) |
||
limitToFirst(limit: number) |
Query |
有关说明,请参阅Firebase文档中的limitToFirst。 |
limitToLast(limit: number) |
Query |
有关说明,请参阅Firebase文档中的limitToLast。 |
off(eventType?: EventType, callback?: (a: DataSnapshot, b: string) => void, context?: Record<string, any>) |
void |
|
`on(eventType: EventType, callback: (data: DataSnapshot, previousChildKey: string) => void, cancelCallbackOrContext?: (a: FirebaseError) => void | Record<string, any>, context?: Record<string, any>)` | (a: DataSnapshot, b: string) => void |
`once(eventType: EventType, successCallback?: (a: DataSnapshot, b: string) => any, failureCallbackContext?: (a: FirebaseError) => void | Record<string, any>): Promise |
|
orderByChild(path: string) |
Query |
有关说明,请参阅Firebase文档中的orderByChild。 |
orderByKey() |
Query |
有关说明,请参阅Firebase文档中的orderByKey。 |
orderByPriority() |
Query |
有关说明,请参阅Firebase文档中的orderByPriority。 |
orderByValue() |
Query |
有关说明,请参阅Firebase文档中的orderByValue。 |
`startAt(value: string | 数字 | boolean, key?: string)` |
数据快照类
属性
属性 | 类型 | 描述 |
---|---|---|
android |
com.google.firebase.database.DataSnapshot | 只读 |
ios |
FIRDataSnapshot | 只读 |
key |
字符串 |
只读 |
ref |
引用 |
只读 |
方法
方法 | 返回值 | 描述 |
---|---|---|
child(path: string) |
DataSnapshot |
有关说明,请参阅child。 |
exists() |
布尔值 |
有关说明,请参阅Firebase文档中的exists。 |
exportVal() |
void |
有关说明,请参阅Firebase文档中的exportVal。 |
forEach(action: (child: DataSnapshot) => true) |
布尔值 |
查找forEach的描述 |
getPriority() |
string | number |
有关说明,请参阅Firebase文档中的getPriority。 |
hasChild(path: string) |
布尔值 |
有关说明,请参阅Firebase文档中的hasChild。 |
hasChildren() |
布尔值 |
有关说明,请参阅Firebase文档中的hasChildren。 |
numChildren() |
数字 |
有关说明,请参阅Firebase文档中的numChildren。 |
val() |
void |
有关说明,请参阅Firebase文档中的val。 |
事件类型
EventType可以是以下任何事件名称之一
'value'
'child_added'
'child_changed'
'child_moved'
'child_removed'
事务结果
属性 | 类型 |
---|---|
snapshot |
DataSnapshot |
committed |
布尔值 |
许可证
Apache License Version 2.0