#폴더 레지스트리
안드로이드 공식 문서 참고 링크 :
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)
}