불로구

안드로이드 스튜디오 - 내장 데이터베이스 ROOM 본문

프로그래밍/안드로이드

안드로이드 스튜디오 - 내장 데이터베이스 ROOM

맹이맹이 2021. 4. 4. 23:41
반응형

Room

- Jetpack 프로젝트에서 제공하는 DB 라이브러리

- SQLite에 대한 추상화 레이어 지원

 

Room 구조

- 데이터베이스 : 데이터베이스 폴더를 포함해 앱의 지속적인 관계형 데이터의 기본 연결을 위한 기본 엑세스 포인트

    -> RoomDatabase를 확장하는 추상 클래스여야 함

    -> 주석 내에 데이터베이스와 연결된 항목의 목록을 포함해야 함

    -> 인수가 0개인 @Dao로 주석이 지정된 클래스를 반환하는 추상 메서드를 포함해야 함

    -> 런타임 시 Room.databaseBuilder() or Room.inMemoryDatabaseBuilder()를 호출하여 Database 인스턴스 가져옴

- 항목 : 데이터베이스 내 테이블 

- DAO : 데이터베이스에 엑세스하는 데 사용되는 메서드 포함

 

참고

- 앱이 단일 프로세스에서 실행되면 AppDatabase 객체를 인스턴스화 시 싱글톤 패턴 적용 ( 각 RoomDatabase 인스턴스는 리소스를 많이 소모함 )

- 앱이 여러 프로세스에서 실행되면 데이터베이스 빌더 호출에 enableMultiInstanceInvalidation()을 포함

 

 

적용법

 

1. Dependencies

    implementation 'androidx.room:room-runtime:2.2.6'
    annotationProcessor "androidx.room:room-compiler:2.2.6"

2. Entity ( Todo.class )

package com.example.javaroom;

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

@Entity
public class Todo {
    @PrimaryKey
    private int uid;

    @ColumnInfo(name = "title")
    private String title;

    @ColumnInfo(name = "content")
    private String content;


    public int getUid() {
        return uid;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("uid : " + uid + " , ");
        sb.append("title : " + title + " , ");
        sb.append("content : " + content + " , ");
        return sb.toString();
    }
}

 

3. DAO ( TodoDAO.class )

package com.example.javaroom;

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

import java.util.List;

@Dao
public interface TodoDAO {
    @Query("SELECT * FROM Todo")
    List<Todo> getAll();

    @Query("SELECT * FROM Todo WHERE uid IN (:uid_Num)")
    Todo getByUid(int uid_Num);

    @Query("SELECT uid FROM todo ORDER BY uid DESC LIMIT 1")
    int getUid();

    @Insert
    void insert_Todo(Todo todo);

    @Update
    void update_Todo(Todo todo);

    @Query("DELETE FROM Todo WHERE uid IN (:uid_num)")
    void delete_Todo(int uid_num);

    @Delete
    void delete_Todo(Todo todo);

    @Query("DELETE FROM Todo")
    void deleteAll();
}

4. DB ( AppDatabase.class )

package com.example.javaroom;

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

@Database(entities = {Todo.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract TodoDAO todoDAO();
}

5. MainActivity

package com.example.javaroom;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;
import androidx.room.Room;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private EditText todo_title;
    private Button add_Button;
    private EditText todo_content;
    private TextView result_Text;
    private Button del_Button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        todo_title = findViewById(R.id.todo_Edit);
        add_Button = findViewById(R.id.add_Button);
        todo_content = findViewById(R.id.todo_content);
        result_Text = findViewById(R.id.result_text);
        del_Button = findViewById(R.id.del_Button);

        final AppDatabase db = Room.databaseBuilder(this, AppDatabase.class, "todo-db")
                .allowMainThreadQueries()
                .build();

        result_Text.setText(db.todoDAO().getAll().toString());
        add_Button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Todo todo = new Todo();
                int last_Uid = db.todoDAO().getUid() + 1;
                if(last_Uid <= 0){
                    last_Uid = 1;
                }
                todo.setUid((last_Uid));
                todo.setTitle(todo_title.getText().toString());
                todo.setContent(todo_content.getText().toString());

                db.todoDAO().insert_Todo(todo);
                result_Text.setText(db.todoDAO().getAll().toString());

            }
        });

        del_Button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                db.todoDAO().deleteAll();
                result_Text.setText("");
            }
        });
    }
}
반응형
Comments