Flutter中Firebase实时数据库Database使用

  下班等老婆中...
  闲来无事,把之前堆在那未完的文章写写~ 今天主要是写写Firebase实时数据库如何使用的问题,因为借着上一篇文章的余热赶紧把关于Firebase使用相关的记录下来,好记性不如烂**

  老规矩,先上酸菜~
《Flutter的拨云见日》系列文章如下:
1、Flutter中指定字体(全局或者局部,自有字库或第三方)
2、Flutter发布Package(Pub.dev或私有Pub仓库)
3、Flutter中解决输入框(TextField)被键盘遮挡问题
4、Flutter 如何在不同环境上运行和打包
5、Flutter 中为Firebase提供多个构建环境分离配置
6、Flutter中Firebase实时数据库Database使用

一、Database是什么

  Firebase实时数据库是Google Firebase平台上的一个云端数据库功能,可以实时、离线同步存储数据,非常实时,方便,并且数据以Json格式存储。
  其实读者都在看这篇文章了,其实也不用多少啥了,必然知道这是个什么鬼
  下面开始分步骤讲解,挺简单的。

二、Flutter工程中引入Pub.dev中firebase_database第三方库

2.1 在工程配置文件pubspec.yaml文件中加入:
dependencies:
  firebase_database: ^4.1.1
2.2 使用命令或者在Android Studio中点击Pub get
$ flutter pub get(命令)

三、Android和IOS两端工程配置

3.1 IOS无需配置只需要Pod install就可以了
3.2 Android端打开工程根目录下的build.gradle文件添加google-service
buildscript {
    repositories {
       ...
    }

    dependencies {
        ...
        classpath 'com.google.gms:google-services:4.3.3'
        ...
    }
}
3.3 Android工程目录打开app/build.gradle文件添加以下代码
//置于文件最后
apply plugin: 'com.google.gms.google-services' 
3.4 至于google-service.json和GoogleService-Info.plist文件添加工程这是必须的,方法见《Flutter 中为Firebase提供多个构建环境分离配置》,这里就不多说了。

四、firebase-database插件在Flutter上的使用

4.1 获取FirebaseDatabase实例

这里有两种方式获取
方式一:

1.直接获取FirebaseDatabase实例,这里使用的是默认数据库
FirebaseDatabase firebaseDatabase = FirebaseDatabase.instance;

方式二:

因为实时数据库如果是付费的话可以新建多个数据库,一般默认是使用默认的数据库,
如果你新生成了一个数据库,你可以新建一个FirebaseUtil类,用类似FirebaseDatabase.instance方式使用
如下所示:
class FirebaseUtil{

  static FirebaseDatabase _instance = FirebaseDatabase(
                      databaseURL: firebaseDataBaseUrl);
   //firebaseDataBaseUrl 就是你的数据库url

  static get instance => _instance;
}

在其他地方使用的话就是:
FirebaseDatabase firebaseDatabase = FirebaseUtil.instance;
4.2 获取DatabaseReference

DatabaseReferece代表的是一个节点,因为实时数据库整个是一个Json结构,每一个DatabaseReference代表一个节点或字段,你可以合理的规划好你的数据结构,如根节点是userId等,然后在userID下划分不同分区,其实就是代表不同的数据库表

//1、获取根节点DatabaseReference
DatabaseReference root_database_ref  = FirebaseDatabase.instance
                                            .reference();

//2、 为根节点设置不同的DatabaseReference分区
//方法一:
DatabaseReference childRef = root_database_ref.child(childRefName);
//childRefName 这是你自己命名的子节点或分区的名字

//方法二:
DatabaseReference childRef = root_database_ref.push();
//这是使用push()方法,它将生成以时间戳为基础的唯一key。这里主要应用于像列表,
//你不想给每个Item都设置名称,就可以用这种自动生成随机key的方式获取DatabaseReference
String key = childRef.key;
4.3 读取和写入、删除数据

4.3.1 写入数据

childRef.set(value);

4.3.2 读取数据
读取数据我们需要监听DatabaseReference的变化,类似观察者模式

//方法一:仅监听一次
DataSnapshot dataSnapshot = await childRef.once();

//方法二:一直监听
StreamSubscription childSubscription = 
      childRef.onValue.listen((event) {
         print('event?.snapshot?.value?.length : ${event?.snapshot?.value
                  ?.length}');
          if (event?.snapshot?.value != null ) {
            ...
          }
      });
...
//每当childRef节点有数据变动时就会触发监听机制

//注意:前方避坑!!!!
//数据变动就触发监听机制,意味着删除也会触发,如果你想做一些类似埋点功能,
//收集埋点数据上传后,需要将数据删除,这时候这个onValue监听函数还是会获取删除的数据,
//你的估计又会上传一次,这样就会有问题,这里解决办法是,埋点数据上传成功后,先调用下面的childSubscription?.cancel(); 暂停监听,设置一个延时任务后再在开启监听机制就可以解决该问题

//如果你监听处理完事务后,不想再继续监听可以如此
childSubscription?.cancel();
...

4.3.3 删除数据

//remove将删除改DatabaseReference节点下的所有数据,
//如果是你希望单独删除该节点下某个数据你需要获取该数据节点然后调用remove函数
childRef.remove();

DatabaseReference subChildRef = childRef.child(subChildName);
subChildRef.remove();
4.4 数据列表操作

4.4.1 向数据列表中附加数据
上面我们说获取DatabaseReference有两种方式,列表可以用push()函数获取

DatabaseReference listItemRef = childRef.push();

listItemRef.set(value);

4.4.2 监听列表中数据变化

监听器 事件回调函数 说明
Stream onChildAdded 监听项列表中是否添加了新项。 该回调函数会针对每个现有子项触发一次,此后每当有新的子项添加至指定路径时再次触发。
Stream onChildChanged 监听列表中的item是否发生了更改。此事件会在某个子节点(包括该子节点的后代)发生修改时触发。
Stream onChildMoved 监听列表item顺序是否有更改。每当引发子项重新排序的更新触发了 onChildChanged
Stream onChildRemoved 监听列表中是否有item被移除。
StreamSubscription subscription = childRef.onChildAdded
  .listen((event) {

  });

StreamSubscription subscription1 = childRef.onChildChanged
  .listen((event) {

  });

StreamSubscription subscription2 = childRef.onChildMoved
  .listen((event) {

  });

StreamSubscription subscription3 = childRef.onChildRemoved
  .listen((event) {

  });

//如果是取消监听的话就和之前一样
subscription.cancel();

4.4.3 排序数据

方法 用法
orderByChild() 按指定子键的值或嵌套子路径对结果排序。
orderByKey() 根据key对结果排序。
orderByValue() 根据value对结果排序。

五、结语

Firebase 实时数据库就差不多这些了,挺简单的,其实文档包括Android和Ios官方都有,flutter可能少点,自己把firebase-database库引入Flutter工程,玩一玩也就差不多会了。那么下一章节见咯~ 会讲一下如何使用Firebase Cloud Messaging库发送推送。

申明:禁用于商业用途,如若转载,请附带原文链接。https://www.jianshu.com/p/4a893c251412蟹蟹~

PS: 写文不易,觉得没有浪费你时间,请给个点赞~

你可能感兴趣的:(Flutter中Firebase实时数据库Database使用)