1. Ikhtisar
Sasaran
Dalam codelab ini Anda akan membangun aplikasi rekomendasi restoran di Android yang didukung oleh Cloud Firestore. Anda akan belajar cara:
- Membaca dan menulis data ke Firestore dari aplikasi Android
- Dengarkan perubahan data Firestore secara realtime
- Gunakan Firebase Authentication dan aturan keamanan untuk mengamankan data Firestore
- Tulis kueri Firestore yang kompleks
Prasyarat
Sebelum memulai codelab ini, pastikan Anda memiliki:
- Android Studio 4.0 atau lebih tinggi
- Emulator Android dengan API 19 atau lebih tinggi
- Node.js versi 10 atau lebih tinggi
- Java versi 8 atau lebih tinggi
2. Buat proyek Firebase
- Masuk ke konsol Firebase dengan akun Google Anda.
- Di konsol Firebase , klik Tambahkan proyek .
- Seperti yang ditunjukkan pada tangkapan layar di bawah, masukkan nama untuk proyek Firebase Anda (misalnya, "Friendly Eats"), dan klik Lanjutkan .
- Anda mungkin diminta untuk mengaktifkan Google Analytics, untuk tujuan codelab ini, pilihan Anda tidak masalah.
- Setelah sekitar satu menit, proyek Firebase Anda akan siap. Klik Lanjutkan .
3. Siapkan proyek sampel
Unduh kodenya
Jalankan perintah berikut untuk mengkloning kode sampel untuk codelab ini. Ini akan membuat folder bernama friendlyeats-android
di mesin Anda:
$ git clone https://github.com/firebase/friendlyeats-android
Jika Anda tidak memiliki git di mesin Anda, Anda juga dapat mengunduh kode langsung dari GitHub.
Tambahkan konfigurasi Firebase
- Di konsol Firebase , pilih Tinjauan Proyek di navigasi kiri. Klik tombol Android untuk memilih platform. Saat diminta untuk nama paket, gunakan
com.google.firebase.example.fireeats
- Klik Daftar Aplikasi dan ikuti petunjuk untuk mengunduh file
google-services.json
, dan pindahkan ke folderapp/
dari kode yang baru saja Anda unduh. Kemudian klik Berikutnya .
Impor proyek
Buka AndroidStudio. Klik File > New > Import Project dan pilih folder friendlyeats-android .
4. Siapkan Emulator Firebase
Dalam codelab ini, Anda akan menggunakan Firebase Emulator Suite untuk mengemulasi Cloud Firestore dan layanan Firebase lainnya secara lokal. Ini menyediakan lingkungan pengembangan lokal yang aman, cepat, dan tanpa biaya untuk membangun aplikasi Anda.
Instal Firebase CLI
Pertama, Anda perlu menginstal Firebase CLI . Jika Anda menggunakan macOS atau Linux, Anda dapat menjalankan perintah cURL berikut:
curl -sL https://firebase.tools | bash
Jika Anda menggunakan Windows, baca petunjuk penginstalan untuk mendapatkan biner mandiri atau untuk menginstal melalui npm
.
Setelah Anda menginstal CLI, menjalankan firebase --version
akan melaporkan versi 9.0.0
atau lebih tinggi:
$ firebase --version 9.0.0
Gabung
Jalankan firebase login
untuk menghubungkan CLI ke akun Google Anda. Ini akan membuka jendela browser baru untuk menyelesaikan proses login. Pastikan untuk memilih akun yang sama dengan yang Anda gunakan saat membuat proyek Firebase sebelumnya.
Tautkan proyek Anda
Dari dalam folder friendlyeats-android
jalankan firebase use --add
untuk menghubungkan proyek lokal Anda ke proyek Firebase Anda. Ikuti petunjuk untuk memilih proyek yang Anda buat sebelumnya dan jika diminta untuk memilih alias, masukkan default
.
5. Jalankan aplikasi
Sekarang saatnya menjalankan Firebase Emulator Suite dan aplikasi Android FriendlyEats untuk pertama kalinya.
Jalankan emulator
Di terminal Anda dari dalam direktori friendlyeats-android
, jalankan firebase emulators:start
to start up Firebase Emulators. Anda akan melihat log seperti ini:
$ firebase emulators:start i emulators: Starting emulators: auth, firestore i firestore: Firestore Emulator logging to firestore-debug.log i ui: Emulator UI logging to ui-debug.log ┌─────────────────────────────────────────────────────────────┐ │ ✔ All emulators ready! It is now safe to connect your app. │ │ i View Emulator UI at http://localhost:4000 │ └─────────────────────────────────────────────────────────────┘ ┌────────────────┬────────────────┬─────────────────────────────────┐ │ Emulator │ Host:Port │ View in Emulator UI │ ├────────────────┼────────────────┼─────────────────────────────────┤ │ Authentication │ localhost:9099 │ http://localhost:4000/auth │ ├────────────────┼────────────────┼─────────────────────────────────┤ │ Firestore │ localhost:8080 │ http://localhost:4000/firestore │ └────────────────┴────────────────┴─────────────────────────────────┘ Emulator Hub running at localhost:4400 Other reserved ports: 4500 Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.
Anda sekarang memiliki lingkungan pengembangan lokal lengkap yang berjalan di mesin Anda! Pastikan untuk membiarkan perintah ini berjalan selama codelab lainnya, aplikasi Android Anda harus terhubung ke emulator.
Hubungkan aplikasi ke Emulator
Buka file FirebaseUtil.java
di Android Studio. File ini berisi logika untuk menghubungkan Firebase SDK ke emulator lokal yang berjalan di mesin Anda.
Di bagian atas file, periksa baris ini:
/** Use emulators only in debug builds **/
private static final boolean sUseEmulators = BuildConfig.DEBUG;
Kami menggunakan BuildConfig
untuk memastikan kami hanya terhubung ke emulator saat aplikasi kami berjalan dalam mode debug
. Saat kami mengkompilasi aplikasi dalam mode release
, kondisi ini akan salah.
Sekarang lihat metode getFirestore()
:
public static FirebaseFirestore getFirestore() {
if (FIRESTORE == null) {
FIRESTORE = FirebaseFirestore.getInstance();
// Connect to the Cloud Firestore emulator when appropriate. The host '10.0.2.2' is a
// special IP address to let the Android emulator connect to 'localhost'.
if (sUseEmulators) {
FIRESTORE.useEmulator("10.0.2.2", 8080);
}
}
return FIRESTORE;
}
Kita dapat melihat bahwa ia menggunakan metode useEmulator(host, port)
untuk menghubungkan Firebase SDK ke emulator Firestore lokal. Di seluruh aplikasi, kami akan menggunakan FirebaseUtil.getFirestore()
untuk mengakses instance FirebaseFirestore
ini sehingga kami yakin bahwa kami selalu terhubung ke emulator Firestore saat berjalan dalam mode debug
.
Jalankan aplikasinya
Jika Anda telah menambahkan file google-services.json
dengan benar, proyek sekarang harus dikompilasi. Di Android Studio, klik Build > Rebuild Project dan pastikan tidak ada kesalahan yang tersisa.
Di Android Studio Jalankan aplikasi di emulator Android Anda. Pada awalnya Anda akan disajikan dengan layar "Masuk". Anda dapat menggunakan email dan kata sandi apa pun untuk masuk ke aplikasi. Proses masuk ini terhubung ke emulator Firebase Authentication, jadi tidak ada kredensial nyata yang dikirimkan.
Sekarang buka UI Emulator dengan menavigasi ke http://localhost:4000 di browser web Anda. Kemudian klik pada tab Otentikasi dan Anda akan melihat akun yang baru saja Anda buat:
Setelah Anda menyelesaikan proses masuk, Anda akan melihat layar beranda aplikasi:
Segera kami akan menambahkan beberapa data untuk mengisi layar beranda.
6. Tulis data ke Firestore
Di bagian ini kami akan menulis beberapa data ke Firestore sehingga kami dapat mengisi layar beranda yang saat ini kosong.
Objek model utama di aplikasi kami adalah restoran (lihat model/Restaurant.java
). Data Firestore dibagi menjadi dokumen, koleksi, dan subkoleksi. Kami akan menyimpan setiap restoran sebagai dokumen dalam koleksi tingkat atas yang disebut "restaurants"
. Untuk mempelajari lebih lanjut tentang model data Firestore, baca tentang dokumen dan koleksi di dokumentasi .
Untuk tujuan demonstrasi, kami akan menambahkan fungsionalitas di aplikasi untuk membuat sepuluh restoran acak saat kami mengklik tombol "Tambahkan Item Acak" di menu tambahan. Buka file MainActivity.java
dan ganti konten di metode onAddItemsClicked()
dengan:
private void onAddItemsClicked() {
// Get a reference to the restaurants collection
CollectionReference restaurants = mFirestore.collection("restaurants");
for (int i = 0; i < 10; i++) {
// Get a random Restaurant POJO
Restaurant restaurant = RestaurantUtil.getRandom(this);
// Add a new document to the restaurants collection
restaurants.add(restaurant);
}
}
Ada beberapa hal penting yang perlu diperhatikan tentang kode di atas:
- Kami mulai dengan mendapatkan referensi ke koleksi
"restaurants"
. Koleksi dibuat secara implisit saat dokumen ditambahkan, jadi tidak perlu membuat koleksi sebelum menulis data. - Dokumen dapat dibuat menggunakan POJO (Objek Jawa Lama Biasa), yang kami gunakan untuk membuat setiap dokumen Restoran.
- Metode
add()
menambahkan dokumen ke koleksi dengan ID yang dibuat secara otomatis, jadi kita tidak perlu menentukan ID unik untuk setiap Restoran.
Sekarang jalankan aplikasi lagi dan klik tombol "Tambahkan Item Acak" di menu luapan (di sudut kanan atas) untuk menjalankan kode yang baru saja Anda tulis:
Sekarang buka UI Emulator dengan menavigasi ke http://localhost:4000 di browser web Anda. Kemudian klik pada tab Firestore dan Anda akan melihat data yang baru saja Anda tambahkan:
Data ini 100% lokal untuk mesin Anda. Faktanya, proyek Anda yang sebenarnya bahkan belum memiliki database Firestore! Ini berarti aman untuk bereksperimen dengan memodifikasi dan menghapus data ini tanpa konsekuensi.
Selamat, Anda baru saja menulis data ke Firestore! Pada langkah berikutnya kita akan mempelajari cara menampilkan data ini di aplikasi.
7. Menampilkan data dari Firestore
Pada langkah ini kita akan belajar cara mengambil data dari Firestore dan menampilkannya di aplikasi kita. Langkah pertama untuk membaca data dari Firestore adalah membuat Query
. Buka file MainActivity.java
dan tambahkan kode berikut ke awal metode onCreate()
:
mFirestore = FirebaseUtil.getFirestore();
// Get the 50 highest rated restaurants
mQuery = mFirestore.collection("restaurants")
.orderBy("avgRating", Query.Direction.DESCENDING)
.limit(LIMIT);
Sekarang kami ingin mendengarkan kueri, sehingga kami mendapatkan semua dokumen yang cocok dan diberi tahu tentang pembaruan di masa mendatang secara real time. Karena tujuan akhir kita adalah mengikat data ini ke RecyclerView
, kita perlu membuat kelas RecyclerView.Adapter
untuk mendengarkan data.
Buka kelas FirestoreAdapter
, yang telah diimplementasikan sebagian. Pertama, buat adaptor yang mengimplementasikan EventListener
dan mendefinisikan fungsi onEvent
sehingga dapat menerima pembaruan untuk kueri Firestore:
public abstract class FirestoreAdapter<VH extends RecyclerView.ViewHolder>
extends RecyclerView.Adapter<VH>
implements EventListener<QuerySnapshot> { // Add this "implements"
// ...
// Add this method
@Override
public void onEvent(QuerySnapshot documentSnapshots,
FirebaseFirestoreException e) {
// Handle errors
if (e != null) {
Log.w(TAG, "onEvent:error", e);
return;
}
// Dispatch the event
for (DocumentChange change : documentSnapshots.getDocumentChanges()) {
// Snapshot of the changed document
DocumentSnapshot snapshot = change.getDocument();
switch (change.getType()) {
case ADDED:
// TODO: handle document added
break;
case MODIFIED:
// TODO: handle document modified
break;
case REMOVED:
// TODO: handle document removed
break;
}
}
onDataChanged();
}
// ...
}
Pada pemuatan awal, pendengar akan menerima satu acara ADDED
untuk setiap dokumen baru. Karena kumpulan hasil kueri berubah seiring waktu, pendengar akan menerima lebih banyak peristiwa yang berisi perubahan. Sekarang mari kita selesaikan implementasi listener. Pertama tambahkan tiga metode baru: onDocumentAdded
, onDocumentModified
, dan onDocumentRemoved
:
protected void onDocumentAdded(DocumentChange change) {
mSnapshots.add(change.getNewIndex(), change.getDocument());
notifyItemInserted(change.getNewIndex());
}
protected void onDocumentModified(DocumentChange change) {
if (change.getOldIndex() == change.getNewIndex()) {
// Item changed but remained in same position
mSnapshots.set(change.getOldIndex(), change.getDocument());
notifyItemChanged(change.getOldIndex());
} else {
// Item changed and changed position
mSnapshots.remove(change.getOldIndex());
mSnapshots.add(change.getNewIndex(), change.getDocument());
notifyItemMoved(change.getOldIndex(), change.getNewIndex());
}
}
protected void onDocumentRemoved(DocumentChange change) {
mSnapshots.remove(change.getOldIndex());
notifyItemRemoved(change.getOldIndex());
}
Kemudian panggil metode baru ini dari onEvent
:
@Override
public void onEvent(QuerySnapshot documentSnapshots,
FirebaseFirestoreException e) {
// ...
// Dispatch the event
for (DocumentChange change : documentSnapshots.getDocumentChanges()) {
// Snapshot of the changed document
DocumentSnapshot snapshot = change.getDocument();
switch (change.getType()) {
case ADDED:
onDocumentAdded(change); // Add this line
break;
case MODIFIED:
onDocumentModified(change); // Add this line
break;
case REMOVED:
onDocumentRemoved(change); // Add this line
break;
}
}
onDataChanged();
}
Terakhir, terapkan metode startListening()
untuk melampirkan listener:
public void startListening() {
if (mQuery != null && mRegistration == null) {
mRegistration = mQuery.addSnapshotListener(this);
}
}
Sekarang aplikasi sepenuhnya dikonfigurasi untuk membaca data dari Firestore. Jalankan aplikasi lagi dan Anda akan melihat restoran yang Anda tambahkan di langkah sebelumnya:
Sekarang kembali ke UI Emulator di browser Anda dan edit salah satu nama restoran. Anda akan melihatnya berubah di aplikasi hampir seketika!
8. Urutkan dan filter data
Aplikasi saat ini menampilkan restoran berperingkat teratas di seluruh koleksi, tetapi di aplikasi restoran nyata, pengguna ingin mengurutkan dan memfilter data. Misalnya aplikasi harus dapat menampilkan "Restoran makanan laut terbaik di Philadelphia" atau "Pizza paling murah".
Mengklik bilah putih di bagian atas aplikasi akan menampilkan dialog filter. Di bagian ini kita akan menggunakan kueri Firestore untuk membuat dialog ini berfungsi:
Mari edit metode onFilter()
dari MainActivity.java
. Metode ini menerima objek Filters
yang merupakan objek pembantu yang kita buat untuk menangkap output dari dialog filter. Kami akan mengubah metode ini untuk membuat kueri dari filter:
@Override
public void onFilter(Filters filters) {
// Construct basic query
Query query = mFirestore.collection("restaurants");
// Category (equality filter)
if (filters.hasCategory()) {
query = query.whereEqualTo("category", filters.getCategory());
}
// City (equality filter)
if (filters.hasCity()) {
query = query.whereEqualTo("city", filters.getCity());
}
// Price (equality filter)
if (filters.hasPrice()) {
query = query.whereEqualTo("price", filters.getPrice());
}
// Sort by (orderBy with direction)
if (filters.hasSortBy()) {
query = query.orderBy(filters.getSortBy(), filters.getSortDirection());
}
// Limit items
query = query.limit(LIMIT);
// Update the query
mQuery = query;
mAdapter.setQuery(query);
// Set header
mCurrentSearchView.setText(Html.fromHtml(filters.getSearchDescription(this)));
mCurrentSortByView.setText(filters.getOrderDescription(this));
// Save filters
mViewModel.setFilters(filters);
}
Dalam cuplikan di atas kita membangun objek Query
dengan melampirkan klausa where
dan orderBy
agar sesuai dengan filter yang diberikan.
Jalankan aplikasi lagi dan pilih filter berikut untuk menampilkan restoran murah terpopuler:
Anda sekarang akan melihat daftar restoran yang difilter yang hanya berisi opsi harga rendah:
Jika Anda telah sampai sejauh ini, Anda sekarang telah membangun aplikasi melihat rekomendasi restoran yang berfungsi penuh di Firestore! Anda sekarang dapat mengurutkan dan memfilter restoran secara real time. Di beberapa bagian berikutnya kami akan menambahkan ulasan ke restoran dan menambahkan aturan keamanan ke aplikasi.
9. Atur data dalam subkoleksi
Di bagian ini kami akan menambahkan peringkat ke aplikasi sehingga pengguna dapat meninjau restoran favorit (atau paling tidak favorit).
Koleksi dan subkoleksi
Sejauh ini kami telah menyimpan semua data restoran dalam koleksi tingkat atas yang disebut "restoran". Saat pengguna menilai restoran, kami ingin menambahkan objek Rating
baru ke restoran. Untuk tugas ini kita akan menggunakan subkoleksi. Anda dapat menganggap subkoleksi sebagai koleksi yang dilampirkan ke dokumen. Jadi setiap dokumen restoran akan memiliki subkoleksi rating yang penuh dengan dokumen rating. Subkoleksi membantu mengatur data tanpa membebani dokumen kami atau memerlukan kueri yang rumit.
Untuk mengakses subkoleksi, panggil .collection()
pada dokumen induk:
CollectionReference subRef = mFirestore.collection("restaurants")
.document("abc123")
.collection("ratings");
Anda dapat mengakses dan menanyakan subkoleksi seperti halnya dengan koleksi tingkat atas, tidak ada batasan ukuran atau perubahan kinerja. Anda dapat membaca lebih lanjut tentang model data Firestore di sini .
Menulis data dalam sebuah transaksi
Menambahkan Rating
ke subkoleksi yang tepat hanya memerlukan pemanggilan .add()
, tetapi kita juga perlu memperbarui rating rata-rata objek Restaurant
dan jumlah rating untuk mencerminkan data baru. Jika kami menggunakan operasi terpisah untuk membuat dua perubahan ini, ada sejumlah kondisi balapan yang dapat mengakibatkan data basi atau salah.
Untuk memastikan bahwa peringkat ditambahkan dengan benar, kami akan menggunakan transaksi untuk menambahkan peringkat ke restoran. Transaksi ini akan melakukan beberapa tindakan:
- Baca peringkat restoran saat ini dan hitung yang baru
- Tambahkan peringkat ke subkoleksi
- Perbarui peringkat rata-rata restoran dan jumlah peringkat
Buka RestaurantDetailActivity.java
dan implementasikan fungsi addRating
:
private Task<Void> addRating(final DocumentReference restaurantRef,
final Rating rating) {
// Create reference for new rating, for use inside the transaction
final DocumentReference ratingRef = restaurantRef.collection("ratings")
.document();
// In a transaction, add the new rating and update the aggregate totals
return mFirestore.runTransaction(new Transaction.Function<Void>() {
@Override
public Void apply(Transaction transaction)
throws FirebaseFirestoreException {
Restaurant restaurant = transaction.get(restaurantRef)
.toObject(Restaurant.class);
// Compute new number of ratings
int newNumRatings = restaurant.getNumRatings() + 1;
// Compute new average rating
double oldRatingTotal = restaurant.getAvgRating() *
restaurant.getNumRatings();
double newAvgRating = (oldRatingTotal + rating.getRating()) /
newNumRatings;
// Set new restaurant info
restaurant.setNumRatings(newNumRatings);
restaurant.setAvgRating(newAvgRating);
// Commit to Firestore
transaction.set(restaurantRef, restaurant);
transaction.set(ratingRef, rating);
return null;
}
});
}
Fungsi addRating()
mengembalikan Task
yang mewakili seluruh transaksi. Dalam fungsi onRating()
, pendengar ditambahkan ke tugas untuk merespons hasil transaksi.
Sekarang Jalankan aplikasi lagi dan klik salah satu restoran, yang akan memunculkan layar detail restoran. Klik tombol + untuk mulai menambahkan ulasan. Tambahkan ulasan dengan memilih sejumlah bintang dan memasukkan beberapa teks.
Menekan Kirim akan memulai transaksi. Ketika transaksi selesai, Anda akan melihat ulasan Anda ditampilkan di bawah ini dan pembaruan jumlah ulasan restoran:
Selamat! Anda sekarang memiliki aplikasi ulasan restoran seluler, lokal, sosial yang dibangun di Cloud Firestore. Kudengar itu sangat populer akhir-akhir ini.
10. Amankan data Anda
Sejauh ini kami belum mempertimbangkan keamanan aplikasi ini. Bagaimana kita tahu bahwa pengguna hanya dapat membaca dan menulis data sendiri yang benar? Database Firestore diamankan dengan file konfigurasi yang disebut Aturan Keamanan .
Buka file firestore.rules
, Anda akan melihat yang berikut:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
//
// WARNING: These rules are insecure! We will replace them with
// more secure rules later in the codelab
//
allow read, write: if request.auth != null;
}
}
}
Mari kita ubah aturan ini untuk mencegah akses atau perubahan data yang tidak diinginkan, buka file firestore.rules
dan ganti kontennya dengan yang berikut:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Determine if the value of the field "key" is the same
// before and after the request.
function isUnchanged(key) {
return (key in resource.data)
&& (key in request.resource.data)
&& (resource.data[key] == request.resource.data[key]);
}
// Restaurants
match /restaurants/{restaurantId} {
// Any signed-in user can read
allow read: if request.auth != null;
// Any signed-in user can create
// WARNING: this rule is for demo purposes only!
allow create: if request.auth != null;
// Updates are allowed if no fields are added and name is unchanged
allow update: if request.auth != null
&& (request.resource.data.keys() == resource.data.keys())
&& isUnchanged("name");
// Deletes are not allowed.
// Note: this is the default, there is no need to explicitly state this.
allow delete: if false;
// Ratings
match /ratings/{ratingId} {
// Any signed-in user can read
allow read: if request.auth != null;
// Any signed-in user can create if their uid matches the document
allow create: if request.auth != null
&& request.resource.data.userId == request.auth.uid;
// Deletes and updates are not allowed (default)
allow update, delete: if false;
}
}
}
}
Aturan ini membatasi akses untuk memastikan bahwa klien hanya membuat perubahan yang aman. Misalnya pembaruan pada dokumen restoran hanya dapat mengubah peringkat, bukan nama atau data abadi lainnya. Peringkat hanya dapat dibuat jika ID pengguna cocok dengan pengguna yang masuk, yang mencegah spoofing.
Untuk membaca selengkapnya tentang Aturan Keamanan, kunjungi dokumentasi .
11. Kesimpulan
Anda sekarang telah membuat aplikasi berfitur lengkap di atas Firestore. Anda telah mempelajari tentang fitur Firestore yang paling penting termasuk:
- Dokumen dan koleksi
- Membaca dan menulis data
- Menyortir dan memfilter dengan kueri
- Subkoleksi
- Transaksi
Belajarlah lagi
Untuk terus belajar tentang Firestore, berikut adalah beberapa tempat yang bagus untuk memulai:
Aplikasi restoran di codelab ini didasarkan pada aplikasi contoh "Friendly Eats". Anda dapat menelusuri kode sumber untuk aplikasi itu di sini .
Opsional: Terapkan ke produksi
Sejauh ini aplikasi ini hanya menggunakan Firebase Emulator Suite. Jika Anda ingin mempelajari cara menerapkan aplikasi ini ke proyek Firebase yang sebenarnya, lanjutkan ke langkah berikutnya.
12. (Opsional) Terapkan aplikasi Anda
Sejauh ini aplikasi ini sepenuhnya bersifat lokal, semua data ada di Firebase Emulator Suite. Di bagian ini Anda akan mempelajari cara mengonfigurasi proyek Firebase Anda sehingga aplikasi ini akan berfungsi dalam produksi.
Otentikasi Firebase
Di konsol Firebase, buka bagian Otentikasi dan klik Mulai . Navigasikan ke tab Metode masuk dan pilih opsi Email/Kata Sandi dari Penyedia asli .
Aktifkan metode masuk Email/Kata Sandi dan klik Simpan .
toko api
Buat database
Arahkan ke bagian Firestore Database di konsol dan klik Create Database :
- Saat ditanya tentang Aturan Keamanan pilih untuk memulai dalam Mode Produksi , kami akan segera memperbarui aturan tersebut.
- Pilih lokasi database yang ingin Anda gunakan untuk aplikasi Anda. Perhatikan bahwa memilih lokasi database adalah keputusan permanen dan untuk mengubahnya Anda harus membuat proyek baru. Untuk informasi lebih lanjut tentang memilih lokasi proyek, lihat dokumentasi .
Menerapkan Aturan
Untuk menerapkan Aturan Keamanan yang Anda tulis sebelumnya, jalankan perintah berikut di direktori codelab:
$ firebase deploy --only firestore:rules
Ini akan menyebarkan konten firestore.rules
ke proyek Anda, yang dapat Anda konfirmasikan dengan menavigasi ke tab Aturan di konsol.
Menyebarkan Indeks
Aplikasi FriendlyEats memiliki penyortiran dan pemfilteran yang rumit yang memerlukan sejumlah indeks gabungan khusus. Ini dapat dibuat secara manual di Firebase console tetapi lebih mudah untuk menulis definisinya di file firestore.indexes.json
dan menerapkannya menggunakan Firebase CLI.
Jika Anda membuka file firestore.indexes.json
Anda akan melihat bahwa indeks yang diperlukan telah disediakan:
{
"indexes": [
{
"collectionId": "restaurants",
"queryScope": "COLLECTION",
"fields": [
{ "fieldPath": "city", "mode": "ASCENDING" },
{ "fieldPath": "avgRating", "mode": "DESCENDING" }
]
},
{
"collectionId": "restaurants",
"queryScope": "COLLECTION",
"fields": [
{ "fieldPath": "category", "mode": "ASCENDING" },
{ "fieldPath": "avgRating", "mode": "DESCENDING" }
]
},
{
"collectionId": "restaurants",
"queryScope": "COLLECTION",
"fields": [
{ "fieldPath": "price", "mode": "ASCENDING" },
{ "fieldPath": "avgRating", "mode": "DESCENDING" }
]
},
{
"collectionId": "restaurants",
"queryScope": "COLLECTION",
"fields": [
{ "fieldPath": "city", "mode": "ASCENDING" },
{ "fieldPath": "numRatings", "mode": "DESCENDING" }
]
},
{
"collectionId": "restaurants",
"queryScope": "COLLECTION",
"fields": [
{ "fieldPath": "category", "mode": "ASCENDING" },
{ "fieldPath": "numRatings", "mode": "DESCENDING" }
]
},
{
"collectionId": "restaurants",
"queryScope": "COLLECTION",
"fields": [
{ "fieldPath": "price", "mode": "ASCENDING" },
{ "fieldPath": "numRatings", "mode": "DESCENDING" }
]
},
{
"collectionId": "restaurants",
"queryScope": "COLLECTION",
"fields": [
{ "fieldPath": "city", "mode": "ASCENDING" },
{ "fieldPath": "price", "mode": "ASCENDING" }
]
},
{
"collectionId": "restaurants",
"fields": [
{ "fieldPath": "category", "mode": "ASCENDING" },
{ "fieldPath": "price", "mode": "ASCENDING" }
]
}
],
"fieldOverrides": []
}
Untuk menyebarkan indeks ini, jalankan perintah berikut:
$ firebase deploy --only firestore:indexes
Perhatikan bahwa pembuatan indeks tidak instan, Anda dapat memantau kemajuannya di konsol Firebase.
Konfigurasikan aplikasi
Di kelas FirebaseUtil
, kami mengonfigurasi SDK Firebase untuk terhubung ke emulator saat dalam mode debug:
public class FirebaseUtil {
/** Use emulators only in debug builds **/
private static final boolean sUseEmulators = BuildConfig.DEBUG;
// ...
}
Jika Anda ingin menguji aplikasi Anda dengan proyek Firebase yang sebenarnya, Anda dapat:
- Bangun aplikasi dalam mode rilis dan jalankan di perangkat.
- Ubah sementara
sUseEmulators
menjadifalse
dan jalankan aplikasi lagi.
Perhatikan bahwa Anda mungkin perlu Keluar dari aplikasi dan masuk lagi agar terhubung dengan benar ke produksi.