Membuat database Firestore menggunakan library klien web atau seluler
Panduan memulai ini menunjukkan cara menyiapkan Firestore, menambahkan data, dan membaca data menggunakan library klien Android, platform Apple, Web, Unity, atau C++.
Jika Anda belum melakukannya, buat project Firebase: Di Firebase console, klik Tambahkan project, lalu ikuti petunjuk di layar untuk membuat project Firebase atau untuk menambahkan layanan Firebase ke project Google Cloud yang ada.
Buka project Anda di Firebase console. Di panel kiri, luaskan Build, lalu pilih Firestore database.
Klik Create database.
Pilih lokasi untuk database Anda.
Jika lokasi tidak dapat dipilih, berarti "lokasi untuk resource Google Cloud default" project Anda sudah ditetapkan. Beberapa resource project (seperti instance Firestore default) memiliki dependensi lokasi yang sama, dan lokasinya dapat ditetapkan selama pembuatan project atau saat menyiapkan layanan lain yang memiliki dependensi lokasi ini.
Pilih mode awal untuk Aturan Keamanan Firestore Anda:
- Mode pengujian
Cocok untuk memulai dengan library klien seluler dan web, tetapi memungkinkan siapa pun untuk membaca dan menimpa data Anda. Setelah melakukan pengujian, pastikan untuk membaca bagian Melindungi data.
Untuk memulai dengan web, platform Apple, atau Android SDK, pilih mode pengujian.
- Mode terkunci
Menolak semua pembacaan dan penulisan dari klien seluler dan web. Server aplikasi terautentikasi (C#, Go, Java, Node.js, PHP, Python, atau Ruby) masih dapat mengakses database Anda.
Untuk memulai dengan library klien server C#, Go, Java, Node.js, PHP, Python, atau Ruby, pilih mode terkunci.
Kumpulan Aturan Keamanan Firestore awal Anda akan diterapkan ke database Firestore default. Jika Anda membuat beberapa database untuk project, Anda dapat men-deploy Aturan Keamanan Firestore untuk setiap database.
Klik Create.
Saat Anda mengaktifkan Firestore, API di Pengelola Cloud API juga akan aktif.
Menyiapkan lingkungan pengembangan
Tambahkan dependensi dan library klien yang dibutuhkan ke aplikasi Anda.
Web versi 9
- Ikuti petunjuk untuk menambahkan Firebase ke aplikasi Web Anda.
-
Impor Firebase dan Firestore:
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore";
Web versi 8
- Ikuti petunjuk untuk menambahkan Firebase ke aplikasi Web Anda.
- Tambahkan library Firebase dan Firestore ke aplikasi Anda:
Firestore SDK juga tersedia sebagai paket npm.<script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-firestore.js"></script>
Anda harus mewajibkan Firebase dan Firestore secara manual.npm install firebase@8.10.1 --save
const firebase = require("firebase"); // Required for side-effects require("firebase/firestore");
Platform Apple
Ikuti petunjuk untuk menambahkan Firebase ke aplikasi Apple Anda.
Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.
- Di Xcode, dengan project aplikasi Anda dalam keadaan terbuka, buka File > Swift Packages > Add Package Dependency.
- Saat diminta, tambahkan repositori SDK platform Apple Firebase:
- Pilih library Firestore.
- Setelah selesai, Xcode akan otomatis mulai me-resolve dan mendownload dependensi Anda di latar belakang.
https://github.com/firebase/firebase-ios-sdk
Android
- Ikuti petunjuk untuk menambahkan Firebase ke aplikasi Android Anda.
- Deklarasikan dependensi untuk library Firestore untuk Android
dalam file Gradle modul (level aplikasi) (biasanya
app/build.gradle.kts
atauapp/build.gradle
):implementation("com.google.firebase:firebase-firestore:25.1.1")
Jika aplikasi Anda menggunakan beberapa library Firebase, sebaiknya gunakan Firebase Android BoM, yang memastikan bahwa versi library Firebase aplikasi Anda selalu kompatibel.
Mencari modul library khusus Kotlin? Mulai rilis Oktober 2023, developer Kotlin dan Java dapat bergantung pada modul library utama (untuk mengetahui detailnya, lihat FAQ tentang inisiatif ini).
Dart
- Jika belum melakukannya, konfigurasikan dan inisialisasi Firebase di aplikasi Flutter Anda.
- Dari root project Flutter Anda, jalankan perintah berikut untuk menginstal plugin:
flutter pub add cloud_firestore
- Setelah selesai, build ulang aplikasi Flutter Anda:
flutter run
C++
- Ikuti petunjuk untuk menambahkan Firebase ke project C++ Anda.
- Antarmuka C++ untuk Android.
- Dependensi Gradle. Tambahkan kode berikut ke file Gradle modul (level aplikasi), biasanya
app/build.gradle
:android.defaultConfig.externalNativeBuild.cmake { arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir" } apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle" firebaseCpp.dependencies { // earlier entries auth firestore }
- Dependensi biner. Demikian pula, cara yang direkomendasikan untuk mendapatkan dependensi biner adalah dengan menambahkan kode berikut ke file
CMakeLists.txt
Anda:add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL) set(firebase_libs firebase_auth firebase_firestore firebase_app) # Replace the target name below with the actual name of your target, # for example, "native-lib". target_link_libraries(${YOUR_TARGET_NAME_HERE} "${firebase_libs}")
- Untuk menyiapkan integrasi desktop, baca bagian Menambahkan Firebase ke project C++ Anda.
Unity
- Ikuti petunjuk untuk menambahkan Firebase ke project Unity Anda.
- Gunakan antarmuka Unity untuk mengonfigurasi project Anda guna meminifikasi build Android.
- Opsi ini dapat ditemukan di Player Settings > Android > Publishing Settings > Minify.
- Opsi mungkin berbeda pada versi Unity yang berbeda. Jadi, baca dokumentasi resmi Unity dan Panduan Debug Build Unity Firebase.
-
Jika, setelah mengaktifkan minifikasi, jumlah metode yang direferensikan masih
melebihi batas, opsi lainnya adalah mengaktifkan
multidex
di:-
mainTemplate.gradle
jika Template Gradle Khusus pada Setelan Pemain diaktifkan -
atau, file
build.gradle
level modul, jika Anda menggunakan Android Studio untuk mem-build project yang diekspor.
-
Anda harus meminifikasi build tersebut untuk menghindari pesan Error while merging dex archives
.
Melakukan inisialisasi Firestore
Lakukan inisialisasi pada instance Firestore:
Web versi 9
// Initialize Firestore through Firebase import { initializeApp } from "firebase/app" import { getFirestore } from "firebase/firestore" const firebaseApp = initializeApp({ apiKey: '### FIREBASE API KEY ###', authDomain: '### FIREBASE AUTH DOMAIN ###', projectId: '### CLOUD FIRESTORE PROJECT ID ###' }); const db = getFirestore();
Web versi 8
// Initialize Firestore through Firebase firebase.initializeApp({ apiKey: '### FIREBASE API KEY ###', authDomain: '### FIREBASE AUTH DOMAIN ###', projectId: '### CLOUD FIRESTORE PROJECT ID ###' }); var db = firebase.firestore();
Swift
import FirebaseCore import FirebaseFirestore FirebaseApp.configure() let db = Firestore.firestore()
Objective-C
@import FirebaseCore; @import FirebaseFirestore; // Use Firebase library to configure APIs [FIRApp configure]; FIRFirestore *defaultFirestore = [FIRFirestore firestore];
Kotlin
Android
// Access a Firestore instance from your Activity val db = Firebase.firestore
Java
Android
// Access a Firestore instance from your Activity FirebaseFirestore db = FirebaseFirestore.getInstance();
Dart
db = FirebaseFirestore.instance;
C++
// Make sure the call to `Create()` happens some time before you call Firestore::GetInstance(). App::Create(); Firestore* db = Firestore::GetInstance();
Unity
using Firebase.Firestore; using Firebase.Extensions;
FirebaseFirestore db = FirebaseFirestore.DefaultInstance;
Tambahkan data
Firestore menyimpan data dalam Dokumen, yang disimpan dalam Koleksi. Firestore membuat koleksi dan dokumen secara implisit saat pertama kali data ditambahkan ke dokumen. Anda tidak perlu secara eksplisit membuat koleksi atau dokumen.
Buat koleksi baru dan dokumen menggunakan kode contoh berikut.
Web versi 9
import { collection, addDoc } from "firebase/firestore"; try { const docRef = await addDoc(collection(db, "users"), { first: "Ada", last: "Lovelace", born: 1815 }); console.log("Document written with ID: ", docRef.id); } catch (e) { console.error("Error adding document: ", e); }
Web versi 8
db.collection("users").add({ first: "Ada", last: "Lovelace", born: 1815 }) .then((docRef) => { console.log("Document written with ID: ", docRef.id); }) .catch((error) => { console.error("Error adding document: ", error); });
Swift
// Add a new document with a generated ID do { let ref = try await db.collection("users").addDocument(data: [ "first": "Ada", "last": "Lovelace", "born": 1815 ]) print("Document added with ID: \(ref.documentID)") } catch { print("Error adding document: \(error)") }
Objective-C
// Add a new document with a generated ID __block FIRDocumentReference *ref = [[self.db collectionWithPath:@"users"] addDocumentWithData:@{ @"first": @"Ada", @"last": @"Lovelace", @"born": @1815 } completion:^(NSError * _Nullable error) { if (error != nil) { NSLog(@"Error adding document: %@", error); } else { NSLog(@"Document added with ID: %@", ref.documentID); } }];
Kotlin
Android
// Create a new user with a first and last name val user = hashMapOf( "first" to "Ada", "last" to "Lovelace", "born" to 1815, ) // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener { documentReference -> Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}") } .addOnFailureListener { e -> Log.w(TAG, "Error adding document", e) }
Java
Android
// Create a new user with a first and last name Map<String, Object> user = new HashMap<>(); user.put("first", "Ada"); user.put("last", "Lovelace"); user.put("born", 1815); // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(DocumentReference documentReference) { Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId()); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error adding document", e); } });
Dart
// Create a new user with a first and last name final user = <String, dynamic>{ "first": "Ada", "last": "Lovelace", "born": 1815 }; // Add a new document with a generated ID db.collection("users").add(user).then((DocumentReference doc) => print('DocumentSnapshot added with ID: ${doc.id}'));
C++
// Add a new document with a generated ID Future<DocumentReference> user_ref = db->Collection("users").Add({{"first", FieldValue::String("Ada")}, {"last", FieldValue::String("Lovelace")}, {"born", FieldValue::Integer(1815)}}); user_ref.OnCompletion([](const Future<DocumentReference>& future) { if (future.error() == Error::kErrorOk) { std::cout << "DocumentSnapshot added with ID: " << future.result()->id() << std::endl; } else { std::cout << "Error adding document: " << future.error_message() << std::endl; } });
Unity
DocumentReference docRef = db.Collection("users").Document("alovelace"); Dictionary<string, object> user = new Dictionary<string, object> { { "First", "Ada" }, { "Last", "Lovelace" }, { "Born", 1815 }, }; docRef.SetAsync(user).ContinueWithOnMainThread(task => { Debug.Log("Added data to the alovelace document in the users collection."); });
Sekarang tambahkan dokumen lain ke koleksi users
. Perhatikan bahwa dokumen ini berisi key-value pair (nama tengah) yang tidak muncul di dokumen pertama. Dokumen dalam koleksi dapat berisi kumpulan informasi yang berbeda.
Web versi 9
// Add a second document with a generated ID. import { addDoc, collection } from "firebase/firestore"; try { const docRef = await addDoc(collection(db, "users"), { first: "Alan", middle: "Mathison", last: "Turing", born: 1912 }); console.log("Document written with ID: ", docRef.id); } catch (e) { console.error("Error adding document: ", e); }
Web versi 8
// Add a second document with a generated ID. db.collection("users").add({ first: "Alan", middle: "Mathison", last: "Turing", born: 1912 }) .then((docRef) => { console.log("Document written with ID: ", docRef.id); }) .catch((error) => { console.error("Error adding document: ", error); });
Swift
// Add a second document with a generated ID. do { let ref = try await db.collection("users").addDocument(data: [ "first": "Alan", "middle": "Mathison", "last": "Turing", "born": 1912 ]) print("Document added with ID: \(ref.documentID)") } catch { print("Error adding document: \(error)") }
Objective-C
// Add a second document with a generated ID. __block FIRDocumentReference *ref = [[self.db collectionWithPath:@"users"] addDocumentWithData:@{ @"first": @"Alan", @"middle": @"Mathison", @"last": @"Turing", @"born": @1912 } completion:^(NSError * _Nullable error) { if (error != nil) { NSLog(@"Error adding document: %@", error); } else { NSLog(@"Document added with ID: %@", ref.documentID); } }];
Kotlin
Android
// Create a new user with a first, middle, and last name val user = hashMapOf( "first" to "Alan", "middle" to "Mathison", "last" to "Turing", "born" to 1912, ) // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener { documentReference -> Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}") } .addOnFailureListener { e -> Log.w(TAG, "Error adding document", e) }
Java
Android
// Create a new user with a first, middle, and last name Map<String, Object> user = new HashMap<>(); user.put("first", "Alan"); user.put("middle", "Mathison"); user.put("last", "Turing"); user.put("born", 1912); // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(DocumentReference documentReference) { Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId()); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error adding document", e); } });
Dart
// Create a new user with a first and last name final user = <String, dynamic>{ "first": "Alan", "middle": "Mathison", "last": "Turing", "born": 1912 }; // Add a new document with a generated ID db.collection("users").add(user).then((DocumentReference doc) => print('DocumentSnapshot added with ID: ${doc.id}'));
C++
db->Collection("users") .Add({{"first", FieldValue::String("Alan")}, {"middle", FieldValue::String("Mathison")}, {"last", FieldValue::String("Turing")}, {"born", FieldValue::Integer(1912)}}) .OnCompletion([](const Future<DocumentReference>& future) { if (future.error() == Error::kErrorOk) { std::cout << "DocumentSnapshot added with ID: " << future.result()->id() << std::endl; } else { std::cout << "Error adding document: " << future.error_message() << std::endl; } });
Unity
DocumentReference docRef = db.Collection("users").Document("aturing"); Dictionary<string, object> user = new Dictionary<string, object> { { "First", "Alan" }, { "Middle", "Mathison" }, { "Last", "Turing" }, { "Born", 1912 } }; docRef.SetAsync(user).ContinueWithOnMainThread(task => { Debug.Log("Added data to the aturing document in the users collection."); });
Membaca data
Gunakan penampil data di Firebase console untuk dengan cepat memverifikasi bahwa Anda telah menambahkan data ke Firestore.
Anda juga dapat menggunakan metode get
untuk mengambil seluruh koleksi.
Web versi 9
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Web versi 8
db.collection("users").get().then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); }); });
Swift
do { let snapshot = try await db.collection("users").getDocuments() for document in snapshot.documents { print("\(document.documentID) => \(document.data())") } } catch { print("Error getting documents: \(error)") }
Objective-C
[[self.db collectionWithPath:@"users"] getDocumentsWithCompletion:^(FIRQuerySnapshot * _Nullable snapshot, NSError * _Nullable error) { if (error != nil) { NSLog(@"Error getting documents: %@", error); } else { for (FIRDocumentSnapshot *document in snapshot.documents) { NSLog(@"%@ => %@", document.documentID, document.data); } } }];
Kotlin
Android
db.collection("users") .get() .addOnSuccessListener { result -> for (document in result) { Log.d(TAG, "${document.id} => ${document.data}") } } .addOnFailureListener { exception -> Log.w(TAG, "Error getting documents.", exception) }
Java
Android
db.collection("users") .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (QueryDocumentSnapshot document : task.getResult()) { Log.d(TAG, document.getId() + " => " + document.getData()); } } else { Log.w(TAG, "Error getting documents.", task.getException()); } } });
Dart
await db.collection("users").get().then((event) { for (var doc in event.docs) { print("${doc.id} => ${doc.data()}"); } });
C++
Future<QuerySnapshot> users = db->Collection("users").Get(); users.OnCompletion([](const Future<QuerySnapshot>& future) { if (future.error() == Error::kErrorOk) { for (const DocumentSnapshot& document : future.result()->documents()) { std::cout << document << std::endl; } } else { std::cout << "Error getting documents: " << future.error_message() << std::endl; } });
Unity
CollectionReference usersRef = db.Collection("users"); usersRef.GetSnapshotAsync().ContinueWithOnMainThread(task => { QuerySnapshot snapshot = task.Result; foreach (DocumentSnapshot document in snapshot.Documents) { Debug.Log(String.Format("User: {0}", document.Id)); Dictionary<string, object> documentDictionary = document.ToDictionary(); Debug.Log(String.Format("First: {0}", documentDictionary["First"])); if (documentDictionary.ContainsKey("Middle")) { Debug.Log(String.Format("Middle: {0}", documentDictionary["Middle"])); } Debug.Log(String.Format("Last: {0}", documentDictionary["Last"])); Debug.Log(String.Format("Born: {0}", documentDictionary["Born"])); } Debug.Log("Read all data from the users collection."); });
Melindungi data
Gunakan Firebase Authentication dan Aturan Keamanan Firestore untuk mengamankan data Anda di Firestore.
Berikut adalah beberapa kumpulan aturan dasar yang dapat Anda gunakan untuk memulai. Anda dapat mengubah aturan keamanan di tab Aturan Firebase console.
Auth diperlukan
// Allow read/write access on all documents to any user signed in to the application
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
Mode terkunci
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Mode pengujian
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
Sebelum men-deploy aplikasi Web, Android, atau iOS ke produksi, lakukan juga langkah-langkah untuk memastikan bahwa hanya klien aplikasi yang dapat mengakses data Firestore Anda. Lihat dokumentasi App Check.
Menonton video tutorial
Untuk mendapatkan panduan terperinci tentang cara memulai library klien seluler dan web Firestore, silakan tonton salah satu video tutorial berikut:
Web
iOS
Android
Anda dapat menemukan video lainnya di channel YouTube Firebase.
Langkah berikutnya
Perdalam pengetahuan Anda tentang topik berikut:
- Codelab — Pelajari cara menggunakan Firestore dalam aplikasi sungguhan dengan mengikuti codelab untuk Android, iOS, atau Web.
- Model data — Pelajari lebih lanjut pembuatan struktur data di Firestore, termasuk data hierarkis dan subkoleksi.
- Menambahkan data — Pelajari lebih lanjut cara membuat dan memperbarui data di Firestore.
- Mendapatkan data — Pelajari cara mengambil data lebih lanjut.
- Menjalankan kueri sederhana dan gabungan — Pelajari cara menjalankan kueri sederhana dan gabungan.
- Mengurutkan dan membatasi kueri — Pelajari cara mengurutkan dan membatasi data yang ditampilkan oleh kueri.