프로그래밍 언어/Java

[Android java] Room 개념 및 예제(기초)

happy_life 2021. 12. 18. 15:00

 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() 코드를 추가하였습니다.