이번 시간에는 Firebase Realtime Database에
저장된 데이터를 ListView에 보여주고 나서
아이템을 수정하고, 삭제하는 방법을
알아보겠습니다.
이전 포스팅에 이어하기 때문에 따라 하시려면
먼저 보시고 오시면 됩니다.
2022.03.10 - [안드로이드] - [안드로이드] Firebase Realtime Database ListView JSON 읽기, 쓰기 part2
Firebase Realtime Database 설정은 아래
링크로 가셔서 따라 하시면 됩니다.
2022.03.09 - [안드로이드] - [안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part1
- 설명 -
- 수정하기 전 데이터를 담기 위한 변수 추가
String sOldValue;
- 등록버튼을 수정할 때도 사용하게 변경했습니다.
- orderByChild를 통해 데이터를 정렬하고, equalTo를 통해 해당 데이터를 가져옵니다.
- getRef().child를 통해 해당 위치와 데이터를 가져와 데이터를 수정합니다.
- 수정한 뒤 입력창을 초기화, 버튼명을 "쓰기"로 변경합니다.
//데이터 등록
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//입력값 변수에 담기
String sName = nameEdit.getText().toString();
if(addBtn.getText().toString().equals("쓰기")){
//키 생성
String sKey = databaseReference.push().getKey();
//sKey가 null이 아니면 sKey값으로 데이터를 저장한다.
if(sKey != null){
databaseReference.child(sKey).child("value").setValue(sName);
//입력창 초기화
nameEdit.setText("");
}
}else{ //수정
//orderByChild: value값으로 정렬
//equalTo: 해당값 반환
Query query = databaseReference.orderByChild("value").equalTo(sOldValue);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot : snapshot.getChildren()){
//수정된 입력창의 값으로 데이터를 수정한다.
dataSnapshot.getRef().child("value").setValue(sName);
//입력창 초기화
nameEdit.setText("");
//버튼값 쓰기로 변경
addBtn.setText("쓰기");
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
});
- 수정할 아이템을 클릭하면 현재 값을 변수에 담습니다.
- 입력창에 선택 값을 보여줍니다.
- 수정할 아이템을 클릭하면 버튼명이 수정으로 변경됩니다.
//리스트뷰 아이템 클릭 이벤트
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
//변수에 현재값을 담는다.
sOldValue = arrayList.get(position);
//입력창에 선택값을 보여준다.
nameEdit.setText(sOldValue);
//버튼명을 수정으로 바꾼다.
addBtn.setText("수정");
}
});
- 아이템을 길게 누르면 다이얼로그 창을 보여줍니다.
- YES를 누르면 삭제 기능, CANCEL을 누르면 창닫기
//리스트뷰 아이템 길게 클릭 이벤트
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
String sValue = arrayList.get(position);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("삭제");
builder.setMessage("삭제하시겠습니까?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//쿼리 초기화
Query query = databaseReference.orderByChild("value").equalTo(sValue);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot : snapshot.getChildren()){
//데이터 삭제
dataSnapshot.getRef().removeValue();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(MainActivity.this, "error:" + error.getMessage(),
Toast.LENGTH_SHORT).show();
}
});
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//닫기
dialogInterface.dismiss();
}
});
//보여주기
builder.show();
return true;
} //onItemLongClick
});
public class MainActivity extends AppCompatActivity {
ArrayList<String> arrayList = new ArrayList<>();
ArrayAdapter<String> adapter;
FirebaseDatabase firebaseDatabase;
DatabaseReference databaseReference;
ListView listView;
String sOldValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//컴포넌트 변수에 담기
EditText nameEdit = findViewById(R.id.name_edit);
Button addBtn = findViewById(R.id.add_btn);
listView = findViewById(R.id.list_view);
//어뎁터 초기화
adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, arrayList);
//데이터베이스 초기화
firebaseDatabase = FirebaseDatabase.getInstance();
//레퍼런스 초기화
databaseReference = firebaseDatabase.getReference().child("Data");
//데이터 조회
getValue();
//데이터 등록
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//입력값 변수에 담기
String sName = nameEdit.getText().toString();
if(addBtn.getText().toString().equals("쓰기")){
//키 생성
String sKey = databaseReference.push().getKey();
//sKey가 null이 아니면 sKey값으로 데이터를 저장한다.
if(sKey != null){
databaseReference.child(sKey).child("value").setValue(sName);
//입력창 초기화
nameEdit.setText("");
}
}else{ //수정
//orderByChild: value값으로 정렬
//equalTo: 해당값 반환
Query query = databaseReference.orderByChild("value").equalTo(sOldValue);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot : snapshot.getChildren()){
//수정된 입력창의 값으로 데이터를 수정한다.
dataSnapshot.getRef().child("value").setValue(sName);
//입력창 초기화
nameEdit.setText("");
//버튼값 쓰기로 변경
addBtn.setText("쓰기");
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
});
//리스트뷰 아이템 클릭 이벤트트
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
//변수에 현재값을 담는다.
sOldValue = arrayList.get(position);
//입력창에 선택값을 담는다.
nameEdit.setText(sOldValue);
//버튼명을 수정으로 바꾼다.
addBtn.setText("수정");
}
});
//리스트뷰 아이템 길게 클릭 이벤트
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
String sValue = arrayList.get(position);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("삭제");
builder.setMessage("삭제하시겠습니까?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//쿼리 초기화
Query query = databaseReference.orderByChild("value").equalTo(sValue);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot : snapshot.getChildren()){
//데이터 삭제
dataSnapshot.getRef().removeValue();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(MainActivity.this, "error:" + error.getMessage(),
Toast.LENGTH_SHORT).show();
}
});
}
});
builder.setNegativeButton("Cancle", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//닫기
dialogInterface.dismiss();
}
});
//보여주기
builder.show();
return true;
} //onItemLongClick
});
}//onCreate
//파이어베이스에서 데이터 가져오기
private void getValue() {
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
//리스트 초기화
arrayList.clear();
for(DataSnapshot dataSnapshot : snapshot.getChildren()){
//데이터 가져오기(value 이름으로 된 값을 변수에 담는다.
String sValue = dataSnapshot.child("value").getValue(String.class);
//리스트에 변수를 담는다.
arrayList.add(sValue);
}
//리스트뷰 어뎁터 설정
listView.setAdapter(adapter);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(MainActivity.this, "error:" + error.getMessage(),
Toast.LENGTH_SHORT).show();
}
});
}
}
2022.02.24 - [안드로이드] - [안드로이드] 그리드 레이아웃(GridLayout) 카드뷰(CardView) 디자인 꾸미는 방법
[안드로이드] Firebase Realtime Database RecyclerView 사용자 리스트 보는 방법 (2) | 2022.03.13 |
---|---|
[안드로이드] Firebase Realtime Database RecyclerView 사용자 등록하는 방법 (0) | 2022.03.12 |
[안드로이드] Firebase Realtime Database ListView JSON 읽기, 쓰기 part2 (0) | 2022.03.10 |
[안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part1 (0) | 2022.03.09 |
[안드로이드] 달력 (DatePicker) 버튼(Button) 으로 호출하는 방법 (0) | 2022.03.08 |
댓글 영역