??下班等老婆中...
??閑來無事,把之前堆在那未完的文章寫寫~ 今天主要是寫寫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: 寫文不易,覺得沒有浪費你時間,請給個點贊~ ??