안드로이드는 내부에 저장소가 존재한다. 이 저장소는 Room 라이브러리를 이용해 관리하고, JPA처럼 관리가 가능하다.먼저, Room을 의존성을 걸어준다.
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());
}
}
반응형
'Android' 카테고리의 다른 글
Android Studio, JAVA] mvvc 모델과 LiveData (2) | 2020.08.12 |
---|---|
Android Studio] MVVM 패턴 (0) | 2020.08.05 |
안드로이드 스튜디오, JAVA ] 서비스 (0) | 2020.08.05 |
안드로이드 스튜디오, JAVA] 실습 : 레트로핏, 리사이클러뷰, 피카소를 이용한 영화 앱 만들기. (1) | 2020.07.31 |
Android Studio, JAVA] 피카소, Glide 라이브러리 (0) | 2020.07.31 |