본문 바로가기
Android

안드로이드 스튜디오, Java] Room 라이브러리를 이용한 내부 데이터베이스 이용하기

by 김마리님 2020. 8. 5.

안드로이드는 내부에 저장소가 존재한다. 이 저장소는 Room 라이브러리를 이용해 관리하고, JPA처럼 관리가 가능하다.먼저, Room을 의존성을 걸어준다.

https://developer.android.com/topic/libraries/architecture/room?gclid=Cj0KCQiA_rfvBRCPARIsANlV66MiaVR-N-UKQXgBGhlyJCqhDsP8F94bw0SEqOphmQtESQvUc9xl750aAjvGEALw_wcB

 

Room 지속성 라이브러리  |  Android 개발자  |  Android Developers

Room 라이브러리 사용 방법을 알아봅니다.

developer.android.com

   def room_version = "2.2.5"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

 

먼저 모델 라이브러리를 만든다.

package com.mary.mvvmex01;

import androidx.room.Entity;
import androidx.room.PrimaryKey;

import lombok.Builder;
import lombok.Data;

@Entity
public class User {
    @PrimaryKey(autoGenerate = true)
    private int uid;
    private String firstName;
    private String lastName;

    public User(String firstName, String lastName){
        this.firstName=firstName;
        this.lastName=lastName;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

 

다음 룸 데이터베이스와 저장소를 연결해줄 추상클래스를 만든다.

 

AppDatabase.java

package com.mary.mvvmex01;

import androidx.room.Database;
import androidx.room.RoomDatabase;

@Database(entities = {User.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserRepository userRepository();

}

 

다음 연결될 저장소를 만든다.

 

UserRepository.java

package com.mary.mvvmex01;

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;

import java.util.List;

//select 할때만 쿼리 생성, 다른 DML은 어노테이션 걸기.

@Dao
public interface UserRepository {

    @Query("SELECT * FROM user")
    List<User> findAll();

    @Query("SELECT * FROM user where uid=:uid")
    User findById(int uid);

    @Insert
    void insert(User user);

    @Delete
    void delete(User user); //내부에 값을 넣어서 삭제 가능(오버로딩)
}

 

다음 쿼리를 이용하는 법은 다음과 같다.

 

MainActivity.java

 

1. Insert

package com.mary.mvvmex01;

import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import androidx.room.RoomDatabase;

import android.os.Bundle;
import android.util.Log;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "Main_Activity";
    
    private UserRepository userRepository;
    private int i=0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AppDatabase db= Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"db-mary")
                .fallbackToDestructiveMigration() //스키마 버전 변경 가능
                .allowMainThreadQueries() // 메인 스레드에서 DB에 IO를 가능하게 함
                .build();
        userRepository=db.userRepository();

        User user=new User("Mary","Kim");
        userRepository.insert(user);
        Log.d(TAG, "onCreate: 저장됐니?");


    }
}

먼저 현재 컨텍스트데서 데이터베이스를 불러오고, 앞서 모델 라이브러리에서 만들어놓은 User 매서드를 이용하여 값을 집어넣을 수 있다.

 

 

2. findAll

package com.mary.mvvmex01;

import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import androidx.room.RoomDatabase;

import android.os.Bundle;
import android.util.Log;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "Main_Activity";
    
    private UserRepository userRepository;
    private int i=0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AppDatabase db= Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"db-mary")
                .fallbackToDestructiveMigration() //스키마 버전 변경 가능
                .allowMainThreadQueries() // 메인 스레드에서 DB에 IO를 가능하게 함
                .build();
        userRepository=db.userRepository();

        List<User> user2=userRepository.findAll();
        for(i=0; i<user2.size(); i++) {
            Log.d(TAG, "onCreate: findAll() : " + user2.get(i).getUid());
            Log.d(TAG, "onCreate: findAll() : " + user2.get(i).getFirstName());
            Log.d(TAG, "onCreate: findAll() : " + user2.get(i).getLastName());
        }


    }
}

마찬가지로 데이터베이스를 선언한 후 리스트로 값을 호출 -get을 통해 호출이 가능하다.

마찬가지로 id로 값을 부여하는 방식도 유사하다.

 

 

3. findById()

package com.mary.mvvmex01;

import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import androidx.room.RoomDatabase;

import android.os.Bundle;
import android.util.Log;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "Main_Activity";
    
    private UserRepository userRepository;
    private int i=0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AppDatabase db= Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"db-mary")
                .fallbackToDestructiveMigration() //스키마 버전 변경 가능
                .allowMainThreadQueries() // 메인 스레드에서 DB에 IO를 가능하게 함
                .build();
        userRepository=db.userRepository();

        User user3 =userRepository.findById(1);
        Log.d(TAG, "onCreate: findById : "+user3.getFirstName());
        Log.d(TAG, "onCreate: findById : "+user3.getLastName());
    }
}

 

반응형