Flutter中Firebase實時數(shù)據(jù)庫Database使用

??下班等老婆中...
??閑來無事,把之前堆在那未完的文章寫寫~ 今天主要是寫寫Firebase實時數(shù)據(jù)庫如何使用的問題,因為借著上一篇文章的余熱趕緊把關(guān)于Firebase使用相關(guān)的記錄下來,好記性不如爛**

??老規(guī)矩,先上酸菜~
《Flutter的撥云見日》系列文章如下:
1、Flutter中指定字體(全局或者局部,自有字庫或第三方)
2、Flutter發(fā)布Package(Pub.dev或私有Pub倉庫)
3、Flutter中解決輸入框(TextField)被鍵盤遮擋問題
4、Flutter 如何在不同環(huán)境上運行和打包
5、Flutter 中為Firebase提供多個構(gòu)建環(huán)境分離配置
6、Flutter中Firebase實時數(shù)據(jù)庫Database使用

一、Database是什么

??Firebase實時數(shù)據(jù)庫是Google Firebase平臺上的一個云端數(shù)據(jù)庫功能,可以實時、離線同步存儲數(shù)據(jù),非常實時,方便,并且數(shù)據(jù)以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提供多個構(gòu)建環(huán)境分離配置》,這里就不多說了。

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

4.1 獲取FirebaseDatabase實例

這里有兩種方式獲取
方式一:

1.直接獲取FirebaseDatabase實例,這里使用的是默認數(shù)據(jù)庫
FirebaseDatabase firebaseDatabase = FirebaseDatabase.instance;

方式二:

因為實時數(shù)據(jù)庫如果是付費的話可以新建多個數(shù)據(jù)庫,一般默認是使用默認的數(shù)據(jù)庫,
如果你新生成了一個數(shù)據(jù)庫,你可以新建一個FirebaseUtil類,用類似FirebaseDatabase.instance方式使用
如下所示:
class FirebaseUtil{

  static FirebaseDatabase _instance = FirebaseDatabase(
                      databaseURL: firebaseDataBaseUrl);
   //firebaseDataBaseUrl 就是你的數(shù)據(jù)庫url

  static get instance => _instance;
}

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

DatabaseReferece代表的是一個節(jié)點,因為實時數(shù)據(jù)庫整個是一個Json結(jié)構(gòu),每一個DatabaseReference代表一個節(jié)點或字段,你可以合理的規(guī)劃好你的數(shù)據(jù)結(jié)構(gòu),如根節(jié)點是userId等,然后在userID下劃分不同分區(qū),其實就是代表不同的數(shù)據(jù)庫表

//1、獲取根節(jié)點DatabaseReference
DatabaseReference root_database_ref  = FirebaseDatabase.instance
                                            .reference();

//2、 為根節(jié)點設(shè)置不同的DatabaseReference分區(qū)
//方法一:
DatabaseReference childRef = root_database_ref.child(childRefName);
//childRefName 這是你自己命名的子節(jié)點或分區(qū)的名字

//方法二:
DatabaseReference childRef = root_database_ref.push();
//這是使用push()方法,它將生成以時間戳為基礎(chǔ)的唯一key。這里主要應(yīng)用于像列表,
//你不想給每個Item都設(shè)置名稱,就可以用這種自動生成隨機key的方式獲取DatabaseReference
String key = childRef.key;
4.3 讀取和寫入、刪除數(shù)據(jù)

4.3.1 寫入數(shù)據(jù)

childRef.set(value);

4.3.2 讀取數(shù)據(jù)
讀取數(shù)據(jù)我們需要監(jiān)聽DatabaseReference的變化,類似觀察者模式

//方法一:僅監(jiān)聽一次
DataSnapshot dataSnapshot = await childRef.once();

//方法二:一直監(jiān)聽
StreamSubscription<Event> childSubscription = 
      childRef.onValue.listen((event) {
         print('event?.snapshot?.value?.length : ${event?.snapshot?.value
                  ?.length}');
          if (event?.snapshot?.value != null ) {
            ...
          }
      });
...
//每當childRef節(jié)點有數(shù)據(jù)變動時就會觸發(fā)監(jiān)聽機制

//注意:前方避坑?。。。?//數(shù)據(jù)變動就觸發(fā)監(jiān)聽機制,意味著刪除也會觸發(fā),如果你想做一些類似埋點功能,
//收集埋點數(shù)據(jù)上傳后,需要將數(shù)據(jù)刪除,這時候這個onValue監(jiān)聽函數(shù)還是會獲取刪除的數(shù)據(jù),
//你的估計又會上傳一次,這樣就會有問題,這里解決辦法是,埋點數(shù)據(jù)上傳成功后,先調(diào)用下面的childSubscription?.cancel(); 暫停監(jiān)聽,設(shè)置一個延時任務(wù)后再在開啟監(jiān)聽機制就可以解決該問題

//如果你監(jiān)聽處理完事務(wù)后,不想再繼續(xù)監(jiān)聽可以如此
childSubscription?.cancel();
...

4.3.3 刪除數(shù)據(jù)

//remove將刪除改DatabaseReference節(jié)點下的所有數(shù)據(jù),
//如果是你希望單獨刪除該節(jié)點下某個數(shù)據(jù)你需要獲取該數(shù)據(jù)節(jié)點然后調(diào)用remove函數(shù)
childRef.remove();

DatabaseReference subChildRef = childRef.child(subChildName);
subChildRef.remove();
4.4 數(shù)據(jù)列表操作

4.4.1 向數(shù)據(jù)列表中附加數(shù)據(jù)
上面我們說獲取DatabaseReference有兩種方式,列表可以用push()函數(shù)獲取

DatabaseReference listItemRef = childRef.push();

listItemRef.set(value);

4.4.2 監(jiān)聽列表中數(shù)據(jù)變化

監(jiān)聽器 事件回調(diào)函數(shù) 說明
Stream<Event> onChildAdded 監(jiān)聽項列表中是否添加了新項。 該回調(diào)函數(shù)會針對每個現(xiàn)有子項觸發(fā)一次,此后每當有新的子項添加至指定路徑時再次觸發(fā)。
Stream<Event> onChildChanged 監(jiān)聽列表中的item是否發(fā)生了更改。此事件會在某個子節(jié)點(包括該子節(jié)點的后代)發(fā)生修改時觸發(fā)。
Stream<Event> onChildMoved 監(jiān)聽列表item順序是否有更改。每當引發(fā)子項重新排序的更新觸發(fā)了 onChildChanged
Stream<Event> onChildRemoved 監(jiān)聽列表中是否有item被移除。
StreamSubscription<Event> subscription = childRef.onChildAdded
  .listen((event) {

  });

StreamSubscription<Event> subscription1 = childRef.onChildChanged
  .listen((event) {

  });

StreamSubscription<Event> subscription2 = childRef.onChildMoved
  .listen((event) {

  });

StreamSubscription<Event> subscription3 = childRef.onChildRemoved
  .listen((event) {

  });

//如果是取消監(jiān)聽的話就和之前一樣
subscription.cancel();

4.4.3 排序數(shù)據(jù)

方法 用法
orderByChild() 按指定子鍵的值或嵌套子路徑對結(jié)果排序。
orderByKey() 根據(jù)key對結(jié)果排序。
orderByValue() 根據(jù)value對結(jié)果排序。

五、結(jié)語

Firebase 實時數(shù)據(jù)庫就差不多這些了,挺簡單的,其實文檔包括Android和Ios官方都有,flutter可能少點,自己把firebase-database庫引入Flutter工程,玩一玩也就差不多會了。那么下一章節(jié)見咯~ 會講一下如何使用Firebase Cloud Messaging庫發(fā)送推送。

申明:禁用于商業(yè)用途,如若轉(zhuǎn)載,請附帶原文鏈接。http://www.lxweimin.com/p/4a893c251412蟹蟹~

PS: 寫文不易,覺得沒有浪費你時間,請給個點贊~ ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。