[Android Studio] Database Room 생성

Jean·2023년 8월 4일
1

#폴더 레지스트리

안드로이드 공식 문서 참고 링크 :
https://developer.android.com/training/data-storage/room?hl=ko

#MainActivity

@OptIn(ExperimentalMaterial3Api::class)
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            PersonalInfoTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    var name by remember { mutableStateOf("") }
                    var savedname by remember { mutableStateOf("") }
                    var email by remember { mutableStateOf("") }
                    var savedemail by remember { mutableStateOf("") }
                    var phone by remember { mutableStateOf("") }
                    var savedphone by remember { mutableStateOf("") }
                    var age by remember { mutableStateOf("") }
                    var savedage by remember { mutableStateOf("") }
                    var context = LocalContext.current
                    Box(modifier = Modifier.fillMaxSize()) {
                        Column(
                            modifier = Modifier.align(Alignment.Center),
                            horizontalAlignment = Alignment.CenterHorizontally
                        ) {
                            //remember를 하는 이유는 한 번 가져온 데이터를 수정할 필요가 없다.
                            val db = remember {
                                Room.databaseBuilder(
                                    context,
                                    AppDatabase::class.java, "contacts.db"
                                ).addMigrations(MIGRATION_1_2).build()
                            }
                            //오류가 나서 작성하는 코드 main에 접근 불가능 할 때 작성 (비동기 코드)
                            val scope = rememberCoroutineScope()
                            TextField(
                                value = name,
                                onValueChange = { name = it },
                                label = { Text(text = "enter your name") },
                                placeholder = { Text(text = "") }
                            )
                            TextField(
                                value = email,
                                onValueChange = { email = it },
                                label = { Text(text = "enter your email") },
                                placeholder = { Text(text = "") }
                            )
                            TextField(
                                value = phone,
                                onValueChange = { phone = it },
                                label = { Text(text = "enter your phone") },
                                placeholder = { Text(text = "") }
                            )

                            TextField(value = age,
                                onValueChange = { age = it },
                                label = { Text(text = "enter your age") },
                                placeholder = { Text(text = "") }
                            )

                            Button(onClick = {
                                savedname = name
                                savedemail = email
                                savedphone = phone

                                if(age.toIntOrNull() == null) {
                                    age = "0"
                                }
                                savedage = age
                                val newUser = User(name = name, email = email, phone = phone, age = age.toInt() )
                                //여기도 scope와 이어지는 비동기 코드
                                scope.launch(Dispatchers.IO) {
                                    db.userDao().insertAll(newUser)
                                }
                            }) {
                                Text(text = "등록")
                            }
                            Divider(Modifier.width(20.dp))

                            Text(text = "이름 : $savedname")
                            Text(text = "이메일 : $savedemail")
                            Text(text = "전화번호 : $savedphone")
                            Text(text = "나이 : $savedage")


                        }

                    }
                }
            }
        }
    }
}

#AppDatabase.kt

@Database(entities = [User::class], version = 2)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDAO
}

val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        //추가한 데이터 User, phone, email 추가
        //database에 sql 실행, TEXT String, INTEGER Int
        database.execSQL("ALTER TABLE User ADD COLUMN phone TEXT")
        database.execSQL("ALTER TABLE User ADD COLUMN email TEXT")
        database.execSQL("ALTER TABLE User ADD COLUMN age INTEGER")
    }
}

#User

@Entity
data class User(
    @PrimaryKey(autoGenerate = true) val uid: Int = 0,
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "email") val email: String? =  null,
    @ColumnInfo(name = "phone") val phone: String? = null,
    @ColumnInfo(name = "age") val age: Int? = null,
)

#UserDAO

@Dao
interface UserDAO {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>

    @Query("SELECT * FROM user WHERE name LIKE :name LIMIT 1")
    fun findByName(name : String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}
profile
아 왜 안돼

0개의 댓글