firebase realtime database kotlin android
orderbychild 여러개한 구문에 쓸수 없다.
pushkey는 20자리 chars이다. ref) https://stackoverflow.com/a/43873927
pagination 하는 과정이 좀더 복잡하다. 단순히 시작점, 마침점 사이를 가져오게 할수 없다. 예를 들어 첫페이지의 마지막 항목의 시간이 2020-07-01이었으면 이값을 저장하고 있다가 두번째 페이지 데이터를 가져올때 startAt(값)을 넣어 가져와야 한다.
데이터생성시 자동 timestamp가 기록되는 기능이 없다. 그러므로 시간 정렬이 필요한 경우 직접 timestamp 값을 long형태로 넣어나 firebase가 만들어내는 고유key를 이용해서 정렬해야 한다.
https://stackoverflow.com/a/41142720에 따르면 . $ [ ] / #를 key에 사용할수 없다.
addListenerForSingleValueEvent 를 통해서 snapshot을 얻어올수도 있지만 최초로 addCildEventListener를 node에 연결할때 되돌아 오는 snapshot을 이용할수 있다. 단 addCildEventListener 의 경우 listener가 연결된 지점이하 child 들의 snapshot이 한번에 오는 것이 아니고 순차적으로 하나씩오게 된다. ( addValueEventListener를 사용하는 경우를 다시 비교 확인해볼 필요있다. )
node의 key, value개념과 child개념을 혼동하면 안된다.
children을 통해 child들을 통으로 가져오려는 경우 children의 parent node에 listener를 연결한다. 때때로 wrapper parent를 만들어야 하는경우도 있다. ( 이렇게 알고 있었지만 wrapper를 만들지 않고 collection형태의 값이 있는 node에 addValueEventListener를 이용해서 collection 형태의 snapshot을 바로 얻을수도 있다.)
addValueEventListener의 장점중 하나는 존재하지 않는 path에 addValueEventListener를 사용해도 snapshot이 되돌아 오며 snapshot.exists()를 통해 path가 실제로 존재하는지 확인 가능하다. addCildEventListener의 경우 path존재 유무를 확인할 방법이 없었다. snapshot도 error도 되돌아 오지 않기 때문이다.
getValue()사용시 collection형태로 data를 가져오려는 경우 GenericTypeIndicator를 이용한다.
val type = object : GenericTypeIndicator<HashMap<String,String>>() {} val precios : HashMap<String,String> = dataSnapshot.getValue(type!!) liveData.postValue(precios)
ref)kotlin https://stackoverflow.com/a/52684990/3151712
ref)official docs https://firebase.google.com/docs/reference/android/com/google/firebase/database/GenericTypeIndicator
google firebase realtime database official docs
https://firebase.google.com/docs/database/android/start
To make your app data update in realtime, you should add a ValueEventListener to the reference you just created. (ChildEventListerner는 현 node아래 child를 관찰하는 것이고 ValueEventListener는 현재node 및 child를 관찰하는 것이다)
The onDataChange() method in this class is triggered once when the listener is attached and again every time the data changes, including the children.
All Firebase Realtime Database data is stored as JSON objects. 그러므로 json으로 표현되기 쉬운 형태로 database구성을 생각한다.
jacob.body.head.eyes.pupil 이런식으로 저장된다고 생각하고 jacob body head eyes pupil은 key이름이며 이안에 다양한 타입의 data가 들어있다. 또 jacob boddy head eyes pupil 은 각각 node이다.
t's best to keep your data structure as flat as possible. 너무 많이 nested되지 않게 하며 각 node의 데이터를 가져온다는 이야기는 하부의 모든 데이터도 같이 가져온다는 이야기가 되기 때문에 염두에 둔다.
https://firebase.google.com/docs/database/android/read-and-write
각 node의 reference에서 setValue()를 통해 값을 쓰고 교환하고 지우기(null을 설정)를 할수 있다.
Pass types that correspond to the available JSON types as follows:
Pass a custom Java object,
if the class that defines it has a default constructor that takes no arguments and has public getters for the properties to be assigned.
To read data at a path and listen for changes, use the addValueEventListener() or addListenerForSingleValueEvent() method to add a ValueEventListener to a DatabaseReference. (addValueEventListener 나 addListenerForSingleValueEvent 둘다 ValueEventListener를 사용하는 것은 같다. 다만addListenerForSingleValueEvent는 한번 데이터 snapshot을 가져오고 listener 스스로 삭제된다)
위 그림에서 ValueEventListener also defines the onCancelled() method that is called if the read is canceled. For example, a read can be canceled if the client doesn't have permission to read from a Firebase database location.
updateChildren()을 이용 해당 node의 여러 child node의 데이터를 하나의 작업으로 수정가능하다. (update만 가능한게 아니라 create도 가능하다.)
Simultaneous updates made this way are atomic: either all updates succeed or all updates fail.
setValue() and updateChildren() 작업에는 아래와 같이 listener를 달아서 바로 결과를 확인할수 있다. (setValue()로 create, delete,update작업을 할수 있으므로 모든 작업에 listener를 아래와 같이 달아서 확인 가능)
특정 node에 덧붙여진 listener를 removeEventListener() 를 통해 제거해야 하며 덧붙여진 갯수 만큼 제거 해야 하고 . child node에 있는 것이 자동으로 제거되는 건 아니므로 child node에 따로 접근 제거해야 한다.
https://firebase.google.com/docs/database/android/lists-of-data
collection 형태의 자료를 가지고 있는 node의 경우 node에 ChildEventListener를 붙이면 onChildAdded, onChildChanged, onChildRemoved 을 통해 돌아 오는 snapshot이 각각 하나의 element가 된다. ValueEventListener를 사용하는 경우는 snapshot이 collection전체를 가지고 있게 된다. 이때 for (postSnapshot in dataSnapshot.children) {} 이런 형태로 접근하게 된다.
데이터 정렬방법은 위와 같으며 단 한개만 설정할수 있다.
위그림은 먼저 정렬된 상태에서 ChildEventListener를 붙이는 모습을 보여준다.
위그림은 nested child를 경로 지정으로 정렬기준을 조정하는 방법
위 query method는 여러개를 사용할수 있다.
query 성능 개선을 위해서는 index를 이용할수 있다. ( https://firebase.google.com/docs/database/security/indexing-data )
original source : https://www.youtube.com/playlist?list=PLk7v1Z2rk4hg3cbALQuTQOTgpZ9e9T8bi
addListenerForSingleValueEvent 현재 상태에서 snapshot가져오는 함수
addValueEventListener 하나의 노드 실시간 감시
addCildEventListener 자식노드까지 실시간 감시
firebase realtime database
또한 두테이블의 relation 도 만들수 없다.
cache size expand offline off line
https://stackoverflow.com/q/38234473/3151712
How do I set the cache size of FirebaseDatabase in the new FirebaseDatabase API for Android?
I am just updating my legacy code to the new version, the old setup would be:
Firebase.setAndroidContext(this); Config config = Firebase.getDefaultConfig(); config.setPersistenceEnabled(true); config.setPersistenceCacheSizeBytes(50 * 1000 * 1000); Firebase.setDefaultConfig(config);
The new code as described in documentations is only
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
But class FirebaseDatabase does not have a method like setPersistenceCacheSizeBytes() as described in this reference: https://firebase.google.com/docs/reference/android/com/google/firebase/database/FirebaseDatabase The new documentation states that the default size is 10Mb, but it does not tell me where to change this default value.
google docs https://firebase.google.com/docs/database/security/rules-conditions
The Firebase documentation says 768 bytes is still the limit for a Key, and that they use UTF-8 encoding. With UTF-8, a character is 1-4 bytes.
However, most characters are 1 byte, unless you use a character such as ♥, which is 3 bytes. Therefore, for normal use of a key, the character limit is 768. If you want to anticipate some outlandish characters, it may be best to be conservative and limit total characters to 500 ,600, or 700. Depends on how you want to use the keys.
https://stackoverflow.com/a/46127034