RDBS
서로 연관된 표의 느낌
1.우선 FirestoreDB를 사용하기 위한 설정 & FirestoreDB SDK 추가
personRef.document().set(person)
document() : ()안에 빈값을 보내면 랜덤값으로 만들어짐
단점 : 순서가 abc순서라 등록순서 뒤바뀔 수 있음
순서대로 넣으려면 날짜 이용!!personRef.document().set(person) 축약 버전 : .add()
personRef.add(person)
package com.bsj0420.ex89firebasefirestoredb;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.bsj0420.ex89firebasefirestoredb.databinding.ActivityMainBinding;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.btnSave.setOnClickListener(view -> clickSave());
binding.btnLoad.setOnClickListener(view -> clickLoad());
}
private void clickSave() {
//1. 값 준비
String name = binding.etName.getText().toString();
int age = Integer.parseInt(binding.etAge.getText().toString());
String address = binding.etAddr.getText().toString();
//2. Firestore DB에 저장
// 식별자와 값을 같이 저장해야함 : Map 단위로 저장
FirebaseFirestore firestore = FirebaseFirestore.getInstance(); //최상위
//3. Person이라는 이름의 컬렉션(테이블이름)을 생성 or 참조하는 참조객체 소환
CollectionReference personRef = firestore.collection("Person");
//없으면 만들고 있으면 참조함
//4. Field값들을 Map으로 준비
Map<String, Object> person = new HashMap<>();
//식별자는 글씨, 값은 아무나~
person.put("name",name);
person.put("age",age);
person.put("address",address);
//5. personRef 참조 컬렉션에 값을 넣기
//5-1) 도큐먼트 부터 써야함***
//document() : ()안에 빈값을 보내면 랜덤값으로 만들어짐
// 단점 : 순서가 abc순서라 등록순서 뒤바뀔 수 있음
// 순서대로 넣으려면 날짜 이용!!
// personRef.document().set(person).addOnSuccessListener(unused -> {
// Toast.makeText(this, "saved", Toast.LENGTH_SHORT).show();
// });
//personRef.document().set(person) 축약 버전 : .add()
personRef.add(person).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
Toast.makeText(MainActivity.this, "saved", Toast.LENGTH_SHORT).show();
}
});
}
}
.get() : 모든 데이타
.whereEqualTo(필드, 값)
데이터를 가져오라고 하면 FirebaseFirestore은 실시간이기 때문에 부를떄 스냅샷을 찍음
package com.bsj0420.ex89firebasefirestoredb;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.bsj0420.ex89firebasefirestoredb.databinding.ActivityMainBinding;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.btnSave.setOnClickListener(view -> clickSave());
binding.btnLoad.setOnClickListener(view -> clickLoad());
}
private void clickLoad() {
//1. FirebaseFirestore 부르기
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
//2. CollectionReference으로 커서 이동
CollectionReference personRef = firestore.collection("person");
//3. get()하면 갖고 있는 거 다 튀어 나옴
//데이터를 가져오라고 하면 FirebaseFirestore은 실시간이기 때문에 부를떄 스냅샷을 찍음
personRef.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
//collection 안에 여러개의 Document가 있어서 반복문 돌려야함
StringBuffer buffer = new StringBuffer();
for( QueryDocumentSnapshot snapshot : queryDocumentSnapshots ){
//(요소 하나 임시 저장 변수: 값 가진 배열)
Map<String, Object> person = snapshot.getData();
String name = person.get("name").toString();
int age = Integer.parseInt(person.get("age").toString());
String address = person.get("address").toString();
buffer.append(name + " : " + age + " : " + address);
}
binding.tv.setText(buffer.toString());
}
});
//** 별외 특정 필드값에 해당하는 데이터 검색하고 싶다면
personRef.get(); // 이건 모든 데이타
personRef.whereEqualTo("name", "리사").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
}
});
}
}