|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Cloud Firestore" |
| 4 | +date: 2019-04-08 |
| 5 | +categories: ["Firebase"] |
| 6 | +image: firebase/cloud_firestore |
| 7 | +github: firebase/tree/master/cloud_firestore |
| 8 | +description: "Firebase" |
| 9 | +version: Firebase-Firestore 18.0 |
| 10 | +keywords: "firebase, chmura, dane, baza, cloud, storage, database, nosql, android, programowanie, programming" |
| 11 | +--- |
| 12 | + |
| 13 | +## Wprowadzenie |
| 14 | +`Cloud Firestore` jest elastyczną, skalowalną, hierarchiczną bazą danych `NoSQL` w chmurze służącą do przechowywania i synchronizowania w czasie rzeczywistym danych między klientami i serwerem. Oferuje wsparcie w trybie `offline` co ułatwia budowania responsywnych aplikacji działających niezależnie od jakości połączenia sieciowego. Umożliwia integracje z `Google Cloud Platform` i funkcjonalnościami `Firebase` jak np. `Cloud Functions` czy `Authentication` oraz innymi zewnętrznymi usługami. Dostęp i modyfikacja danych odbywa się zgodnie z zasadami zachowania bezpieczeństwa i prywatności, które mogą być dodatkowo definiowane za pomocą reguł w konsoli Firebase. |
| 15 | + |
| 16 | +## Model |
| 17 | +Dane reprezentowane są w postaci dokumentów (zbliżonych w stukurze do formatu `JSON`) przechowywanych w zorganizowanej kolekcji w hierarchicznej strukturze bazy danych `NoSQL` (w przeciwieństwie do `SQL` nie ma tabel ani wierszy). Każdy `dokument` składa się z nazwy, zbioru par `klucz - wartość` (prymityw lub obiekt złożony) i może posiadać obiekty zagnieżdzone i podkolekcje. `Kolekcje` pełnią rolę kontenera dla różnych dokumentów i nie mogą posiadać innych kolekcji, a w doborze ich zawartości warto zachować logiczny porządek dzieląc dokumenty ze względu na kategorie i przeznaczenie co upraszcza poruszanie się po strukturze w kodzie klienta. `Podkolekcja` jest kolekcją w dokumencie i służy do budowania zagnieżdzonej struktury folderów. |
| 18 | + |
| 19 | +//TODO rysunek |
| 20 | + |
| 21 | +Ze względu na optymalizacje wydajności dostępu do bazy danych wprowadzony został mechanizm indeksowania, który wyróżnia dwa rodzaje indeksów: `single-field` (przechowuje posortowaną mapę wszystkich dokumentów zawierających dane pole) i `composite` (przechowuje posortowaną mapę wszystkich dokumentów zawierających wiele danych pól). Cloud Firestore jest zaprojektowany przede wszystkim z myślą o dużych kolekcjach małych dokumentów. Aby uzyskać dostęp do dokumentu lub kolekcji należy uzyskać `referencje`. |
| 22 | + |
| 23 | +{% highlight kotlin %} |
| 24 | +private fun createReferences() { |
| 25 | + val database = FirebaseFirestore.getInstance() |
| 26 | + val collectionRef = database.collection("collection") |
| 27 | + val documentRef = collectionRef.document("document") |
| 28 | + val documentRef2 = database.document("collection/document") //or use direct path instead |
| 29 | + val nestedDocumentRef = documentRef.collection("subcollection").document("nested") |
| 30 | +} |
| 31 | +{% endhighlight %} |
| 32 | + |
| 33 | +## Typy |
| 34 | +Dokumenty mogą przechowywać wartości `prymitywów` (numeryczne, logiczne, tekstowe), `obiekty złożone` (koordynaty geograficzne, data i czas), `tablice`, `mapy` i `referencje` do innych dokumentów. |
| 35 | + |
| 36 | +{% highlight kotlin %} |
| 37 | +private fun createExampleData() { |
| 38 | + val document = HashMap<String, Any?>() |
| 39 | + document["text"] = "value" |
| 40 | + document["logic"] = true |
| 41 | + document["number"] = 9.99 |
| 42 | + document["date"] = Timestamp(Date()) |
| 43 | + document["list"] = arrayListOf(1,2,3) |
| 44 | + document["null"] = null |
| 45 | +} |
| 46 | + |
| 47 | +private fun createSimilarData() { |
| 48 | + val person = HashMap<String, Any>() |
| 49 | + person["name"] = "John" |
| 50 | + person["surname"] = "Walker" |
| 51 | + person["born"] = 1805 |
| 52 | + |
| 53 | + //structure of data in the same collection don't have to be exactly the same |
| 54 | + val person2 = HashMap<String, Any>() |
| 55 | + person["name"] = "Jasper" |
| 56 | + person["second"] = "Newton" |
| 57 | + person["surname"] = "Daniel" |
| 58 | + person["born"] = 1850 |
| 59 | + |
| 60 | + //add to database by passing those objects |
| 61 | +} |
| 62 | + |
| 63 | +private fun createDataByObject() { |
| 64 | + val person = Person("William", "Grant", 1839) |
| 65 | + //add to database by passing object |
| 66 | +} |
| 67 | +{% endhighlight %} |
| 68 | + |
| 69 | +## Operacje |
| 70 | +//TODO |
| 71 | + |
| 72 | +## Transakcje |
| 73 | +//TODO |
0 commit comments