전공/Android
[영화 정보 앱 만들기] 04. 데이터 추가하기
BBungyaLog
2024. 6. 20. 15:42
# 구현하고자 하는 것
- 메뉴 클릭 시 나오는 정보 추가를 클릭하면 데이터를 추가하는 창 띄우기
- 데이터 추가 창에서 정보 입력 후 확인 누르면 데이터 반영
# 정보 추가 레이아웃 만들기
- textView와 plainText 사용
- 버튼은 linearLayout 사용하여 병렬 정리
<LinearLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etAddDirector">
<Button
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="추가" />
<Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="취소" />
</LinearLayout>

# 메뉴 아이템 클릭했을 때 화면이 바뀌게 구성
- 아이템 id 선택지 구현
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menuItem01 -> {
}
R.id.menuItem02 -> {
}
R.id.menuItem03 -> {
}
}
return true
}
- 정보 추가창 id=menuItem01, intent를 사용하여 activity 바꾼다
R.id.menuItem01 -> {
val intent = Intent(this@MainActivity, AddActivity::class.java)
startActivityForResult(intent, REQ_ADD)
}
- AddActivity를 만든다
class AddActivity : AppCompatActivity() {
val addBinding by lazy {
ActivityAddBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(addBinding.root)
}
}
- AndroidManifest.xml 에 AddActivity를 추가한다
<activity android:name=".AddActivity" />
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
# SQLDatabase 설정
class MovieDBHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, 1) {
val TAG = "MovieDBHelper"
companion object {
const val DB_NAME = "movie_db"
const val TABLE_NAME = "movie_table"
const val COL_MOVIE = "movie"
const val COL_RATE = "rate"
const val COL_DIRECTOR = "director"
const val COL_DATE = "date"
}
override fun onCreate(db: SQLiteDatabase?) {
val CREATE_TABLE =
"CREATE TABLE $TABLE_NAME ( ${BaseColumns._ID} INTEGER PRIMARY KEY AUTOINCREMENT, " +
"$COL_MOVIE TEXT, $COL_RATE TEXT, $COL_DIRECTOR TEXT, $COL_DATE TEXT )"
Log.d(TAG, CREATE_TABLE) // SQL 문장이 이상 없는지 Log에서 확인 필요
db?.execSQL(CREATE_TABLE)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
val DROP_TABLE ="DROP TABLE IF EXISTS $TABLE_NAME"
db?.execSQL(DROP_TABLE)
onCreate(db)
}
}
- 샘플 데이터 추가
// 샘플 데이터 넣음
db?.execSQL("INSERT INTO $TABLE_NAME VALUES (0, '은혼 더 파이널', '4.5', '미야와키 치즈루', '2021-07-22')")
db?.execSQL("INSERT INTO $TABLE_NAME VALUES (0, '어벤저스 엔드게임', '4.3', '앤서니 루소', '2019-04-24')")
db?.execSQL("INSERT INTO $TABLE_NAME VALUES (0, '엘리멘탈', '4.1', '피터 손', '2023-06-14')")
db?.execSQL("INSERT INTO $TABLE_NAME VALUES (0, '파묘', '4.8', '장재현', '2024-02-22')")
db?.execSQL("INSERT INTO $TABLE_NAME VALUES (0, '범죄도시3', '3.8', '이상용', '2023-05-31')")
db?.execSQL("INSERT INTO $TABLE_NAME VALUES (0, '인사이드 아웃2', '4.1', '켈시 만', '2024-06-12')")
# AddActivity 설정
- 확인 버튼 / 취소 버튼 구현
addBinding.btnAdd.setOnClickListener {
val addETMovie = addBinding.etAddMovie.text.toString()
val addETRate = addBinding.etAddRate.text.toString()
val addETDirector = addBinding.etAddDirector.text.toString()
val addETDate = addBinding.etAddRate.text.toString()
if (addMovie(MovieDto( 0, addETMovie, addETRate, addETDirector, addETDate)) > 0) {
setResult(RESULT_OK)
} else {
setResult(RESULT_CANCELED)
}
finish()
}
addBinding.btnCancel.setOnClickListener {
setResult(RESULT_CANCELED)
finish()
}
- addMovie 함수 구현
fun addMovie(newDto: MovieDto) : Long {
val helper = MovieDBHelper(this)
val db = helper.writableDatabase
val newValue = ContentValues()
newValue.put(MovieDBHelper.COL_MOVIE, newDto.movie)
newValue.put(MovieDBHelper.COL_RATE, newDto.rate)
newValue.put(MovieDBHelper.COL_DIRECTOR, newDto.director)
newValue.put(MovieDBHelper.COL_DATE, newDto.date)
val newCount = db.insert(MovieDBHelper.TABLE_NAME, null, newValue)
helper.close()
return newCount
}
# add 데이터를 main에서 받기
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
REQ_ADD -> {
if (resultCode == RESULT_OK) {
movies.clear() // 기존 항목 제거
movies.addAll(movieDao.getAllMovies()) // 항목 추가
binding.recyclerView.adapter?.notifyDataSetChanged() // RecyclerView 갱신
} else {
// 취소하면 아무것도 안함
}
}
}
}
# 몰랐던 부분
- 데이터베이스에 샘플 데이터를 나중에 넣었을 시 기존 앱 삭제 후 처음부터 run해줘야 반영이 된다
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.