
Realtime Databaseとは
Firebase Realtime DatabaseとはクラウドでホスティングされるJavaScriptで読み書きが可能なデータベース。
データはJSONとして保存され、接続されているすべてのクライアントとリアルタイムで同期可能。
Cloud Firestoreとは
Firebaseの新しいデータベース。Realtime Databaseより簡単に設定が可能。
Cloud FirestoreはRealtime Databaseより機能性、パフォーマンス、スケーラビリティが優れているので特に理由がなければCloud Firestoreのほうを使用したほうが良い。
ちなみにCloud FirestoreもRealtime Databaseと同様にリアルタイムで同期可能だ。
Realtime DatabaseとCloud FirestoreはSQLを使用していないためテーブルや行などのSQLの知識は必要ない。
Realtime Databaseの読み書き設定
まずはFirebaseでログイン認証機能の設定とfirebase deployを使用して読み書きするページを用意しておく。※
※以降は匿名ログイン認証機能を前提として説明。
まずDatabaseのルールのページでログインしている人だけが読み書きできるようルールを設定。
{
"rules": {
"chat": {
".read": "auth != null",
".write": "auth != null"
}
}
}
あとはWebページのほうのJavaScriptに以下のようにfirebase.database().ref('chat')のthenまたはsetを使用すればデータベースを読み書きできるようになる。
<p id="uid">Loading...</p> <button id="login" class="hidden">login</button> <button id="logout" class="hidden">logout</button> <form method="post" class="hidden"> <input type="text" id="t"> <button id="b">送信</button> </form> <ul id="chat"></ul>
// Initialize Firebase
const config = {
// 省略
};
firebase.initializeApp(config);
const auth = firebase.auth()
const login = document.getElementById('login')
const logout = document.getElementById('logout')
const chat = document.getElementById('chat')
const form = document.querySelector('form')
let userData = null
let chatData = []
const t = document.getElementById('t')
const b = document.getElementById('b')
login.addEventListener('click', () => auth.signInAnonymously())
logout.addEventListener('click', () => auth.signOut())
auth.onAuthStateChanged(user => {
userData = user
if (userData) {
login.classList.add('hidden')
logout.classList.remove('hidden')
form.classList.remove('hidden')
uid.textContent = `${userData.uid}でログイン中`
// database read
firebase
.database()
.ref('chat')
.once('value')
.then(result => {
if (result.val()) {
chatData = result.val()
chatData.forEach(v => {
const li = document.createElement('li')
const liText = document.createTextNode(`${v.uid} ${v.value}`)
li.appendChild(liText)
chat.appendChild(li)
})
}
})
// database write
b.addEventListener('click', e => {
const v = t.value.trim()
if (v) {
chatData.push({uid: userData.uid, value: v})
firebase
.database()
.ref('chat')
.set(chatData)
const li = document.createElement('li')
const liText = document.createTextNode(`${userData.uid} ${v}`)
li.appendChild(liText)
chat.appendChild(li)
t.value = ''
}
e.preventDefault()
})
} else {
login.classList.remove('hidden')
logout.classList.add('hidden')
form.classList.add('hidden')
uid.textContent = 'ログアウト中'
}
})
Cloud Firestoreの読み書き設定
まずCloud Firestoreはfirebase-firestore.jsの読み込みが必要なため追記する。(firebase.jsだけでは動作しない)
<script src="https://www.gstatic.com/firebasejs/4.12.1/firebase.js"></script> <script src="https://www.gstatic.com/firebasejs/4.12.1/firebase-firestore.js"></script>
次に書き込み可能にするためにwrite: if falseをtrueに変更
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
あとはfirebase.firestore()をdb定数に入れてdb.collection('users').addと記述するだけで書き込める。
// database write
const db = firebase.firestore()
db.collection('users').add({
first: 'Kenji',
last: 'Iwabe',
born: 1987
})
.then(ref => console.log('id:', ref.id))
.catch(e => console.error('Error:', e))

逆に読み込みの場合はdb.collection('users').get().thenを使用して以下のように記述するだけだ。
const db = firebase.firestore()
db.collection('users').get().then(snap => {
snap.forEach(doc => {
console.log(doc.id);
console.log(doc.data());
});
});



