Room 개념 및 예제(기초)
*Entity란?
@Entity
데이터에서 테이블에 해당하는 것. 같은 형태의 데이터가 여러 개 저장될 수 있는 공간을 의미합니다.
*Dao란?
Direct access object 의 약자
데이터 베이스에서 데이터에 엑세스하기 위한 객체를 의미합니다.
예제
1. dependency에 Room 추가하기
2.UserProfile 이라는 클래스를 만듭니다.
(데이터에 해당)
3.UserProfileDao를 만듭니다.
4.UserProfile 데이터를 관리할 Database 클래스를 만듭니다.
entities 는 데이터에서 사용할 데이터 클래스를 넣어줍니다. version은 신경쓰지 않아도 됩니다.
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<EditText
android:hint="이름"
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<EditText
android:hint="전화번호"
android:id="@+id/phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<EditText
android:hint="주소"
android:id="@+id/address"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/addUserProfile"
android:text="추가"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/user_list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
5.Main에서 db 조작하기
package com.example.myapplication123123123;
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private UserProfileDatabase db;
TextView name,phone,address,userList;
Button addUserProfileBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = Room.databaseBuilder(this,UserProfileDatabase.class,"userprofile").allowMainThreadQueries().build();
//xml 객체 뷰 바인딩
name = findViewById(R.id.name);
phone = findViewById(R.id.phone);
address = findViewById(R.id.address);
userList = findViewById(R.id.user_list);
addUserProfileBtn = findViewById(R.id.addUserProfile);
addUserProfileBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Data 객체
UserProfile userProfile = new UserProfile();
//name,phone,address 가 객체에 들어감
userProfile.name = name.getText().toString();
userProfile.phone = phone.getText().toString();
userProfile.address = address.getText().toString();
//abstract interface 구현 -> UserProfileDao를 사용하여 db에 저장
db.getUserProfileDao().insert(userProfile);
fetchUserProfileList();
}
});
}
private void fetchUserProfileList() {
List<UserProfile> userProfileList = db.getUserProfileDao().getAll();
String userListText = "사용자 목록";
for(UserProfile userProfile : userProfileList){
userListText += "\n"+userProfile.id+" "+userProfile.name+" "+userProfile.phone+" "+userProfile.address;
userList.setText(userListText);
}
}
}
원래 DB는 메인쓰레드에서 하지 않아야 하지만, 메인에서 간단히 동작하도록 하기 위해 allowMainThreadQueries() 코드를 추가하였습니다.