본문 바로가기
Android 개발/Room, Realm, Databases

Room DB 에 DB파일 넣어서 사용하기 # 로컬데이터베이스 SQLite

by Developer88 2022. 11. 4.
반응형

오늘은 RoomDB에 미리 데이터를 넣어서 사용하는 방법에 대해서 정리해 보도록 하겠습니다.

참고로 이 글은 RoomDB를 알고 있어야 이해할 수 있으므로,

Room에 관한 기본적인 사항은 아래 글을 참조해 주세요.

>> Room Persistence Library 총정리 # Android SQLite

 

1. SQLite 파일

1-1. Room 과 SQLite

Room에 대한 설명을 보면, SQLite위에 추상레이어를 제공하는 라이브러리라는 설명이 나옵니다.

RoomDB에 디비파일을 미리 넣을 때 어떤 파일을 넣어야 하는지 감이 옵니다.

바로 SQLite db파일입니다.

 

 

1-2. SQLite 파일 생성

만약 NodeJS의 Express Django같은 프레임워크를 사용한다면,

SqLite3 모듈을 이용해서 SqLite의 DB파일을 생성할 수 있습니다.

SqLite3가 아니더라도, SqLite를 사용하는 ORM모듈들을 이용해서 생성해서 사용하면 됩니다.

 

생성된 DB파일을 확인하고 수정하거나, 만들어 보고 싶다면,

아래의 sqlite browser 프로그램을 이용해볼 수 있습니다.

>> https://sqlitebrowser.org/

 

아래와 같이 Database구조등을 확인해 볼 수 있습니다.

Type등이 잘못되지는 안았는지, 안드로이드에 넣기전에 미리 확인해보는 용도로 사용하면 좋습니다.

간단한 테스트를 위해서 데이터베이스를 수동으로 넣어도 테스트 해 볼수도 있구요.

 

 

 

한가지 주의할 점은,

안드로이드 스튜디오에서 가져다가 쓸 필드의 타입과 같아야 한다는 것 입니다.

특히 SQLite에서 지원하는 데이터타입은 다음의 5가지 뿐인데요.

  • NULL
  • INTEGER
  • REAL
  • TEXT
  • BLOB

특히 Boolean타입을 지원하지 않는다는 점에 주의가 필요합니다.

Booelan타입은 0과 1로 저장해서 사용하라고 되어있는데요.

0이 false이고 1은 true 로 하도록 하고 있습니다.

 

2. SQLite파일 안드로이드 스튜디오에 복사하기

데이터베이스를 만들어서 파일이 생성되면,

".db"로 만드는 파일을 복사해서,

Android Studio의 Assets 폴더에 집어넣어주시면 됩니다.

방법은 간단한데요. 상위폴더에서 아래와 같은 순서로 'Ner>Folder>Assets Folder'순으로 선택해 주시면 됩니다.

 

 

 

그럼 Assets폴더가 생성되는데요.

여기에 database폴더를 만들고, db파일을 아래와 같이 넣어주면 됩니다.

(database폴더안에 넣는 것은 강제사항은 아닙니다.)

 

 

참고로 DB Browser프로그램을 이용하면 테이블의 필드의 타입이 어떻게 되어있는지 볼 수 있구요.

Table을 선택후 아래와 같이 Browse Table을 선택해 주면,

DB파일도 쉽게 보고 수정해 줄 수 있습니다.

 

 

만약 Android Studio에서 Room의 Entity를 아래와 구성하였는데,

Table의 필드의 데이터타입이나 이름이 다르다면,

Entity를 그에 맞게 수정해 주어야 합니다.

참고로 아래와 같이 @ColumnInfo 애노테이션을 사용하면 name을 다르게 해서 사용할 수 있습니다.

 

 

PrimaryKey나 NotNull여부는 반드시 RoomDB의 Entity와 SQLite3파일을 생성하는 앱에서 매칭시켜주어야만 합니다.

 

Room DB를 사용하기 위해 반드시 알아야 하는,

Entity, Dao, Database등을 생성해 사용하는 방법에 대해서는 아래 글을 참조해 주세요.

>> Room Persistence Library 총정리 # Android SQLite

 

다 되었다면, Entity에 맞는 Dao클래스도 아래와 같이 만들어 주었구요.

 

 

이제 Database 클래스 파일도 만들어 주었습니다.

 

 

3. CreateFromAsset

3-1. CreateFromAsset API

Entity, Dao, Database 클래스가 모두 준비되었다면,

이제 Hilt가 Database를 빌드해 주는 방법을 알려주도록 하는 파일을 만들겠습니다.

Hilt를 사용하지 않는다면, provideStoreDatabase함수안에 코드로 database 를 생성해 주면 됩니다.

 

sqlite db파일로 database를 생성하기 위해서는 createFromAsset()함수를 사용해 주어야 하는데요.

(만약, assets폴더가 아니라, 서버나 앱내의 파일폴더에서 파일을 가져와야 하는 상황이라면,

createFromFile()함수를 이용할수도 있습니다.)

 

createFromAsset함수의 인자에는 assets폴더 아래 파일의 path를 적어줍니다.

위에서는 database폴더안에 test.db파일을 넣어주었으므로 아래와 같이 입력해 주면 됩니다.

 

 

 

이제 다 준비가 되었으니, ViewModel에서 가져다 사용해 주기만 하면 됩니다.

 

3-2. IllegalStateException

실행을 해 보았는데 아래와 같은 메시지로 illegalStateException이 났다면,

RoomDB의 Entity와 SQLite의 Database의 Schema가 호환되지 않기 때문인데요.

처음 구현해보면 이런일이 발생하게 되는데요.

그래도, 에러메시지로 Expected:와 Found: 로 구분해서 어느 부분이 다른지를 잘 보여줍니다.

 

NotNull을 SQLite로 파일을 만들 때 챙기지 않았다가,

RoomDB의 Entity상에서는 NotNull상태로 하는 경우에 이런 에러가 많이 발생합니다.

예를 들어, String?이 아닌, String타입으로 선언했다면,

NotNull 이라는 Annotation을 붙이지 않아도 NotNull 입니다.

 

 

한번 Entity와 스키마때문에 에러가 났다면, 테스트시에 앱을 지웠다가 다시 install해서 테스트하는 것이 좋습니다.

데이터베이스가 남아있을 수 있기 때문입니다.

물론 설정에서 데이터베이스만 삭제해도 되구요.

 

이상으로 RoomDB에 데이터베이스 파일을 넣어서 사용하는 방법에 대해서 정리해 보았습니다.

728x90

댓글