Update Existing database in Android using Android Studio Kotlin

안녕 얘들 아, 그 Vignesh CodeAndroid에서 이 비디오에서는 Android에서 기존 데이터베이스를 읽는 방법을 보여줍니다 이를 증명하기 위해 이미 프로젝트를 만들었습니다

여기에는 런처 활동이 있습니다 안에 버튼이 있어요 버튼을 클릭하면 주요 활동을 시작합니다 MainActivity에서 DBHandler 객체가 있습니다 이것을 사용하여 테이블을 읽을 수 있습니다

테이블에 ID와 열이 포함됩니다 여기, 테이블 자체를 만드는 동안 Iam은 0에서 1000까지의 데이터를 데이터베이스에 삽입합니다 거래를 사용하여 왜냐하면 대량 삽입은 트랜잭션을 사용하는 데 시간이 덜 걸리기 때문입니다 MainActivity에서 RecyclerView를 사용하여 모든 데이터를 표시합니다 그래서 getAllData라는 메소드를 만들었습니다

테이블에서 모든 데이터를 읽고 반환합니다 getAllData를 호출하고 numberList라는 변수에 저장하는 DBHandler 객체 사용하기 어댑터가 numberList에서 값을 읽습니다 onBindViewHolder 메소드 내부 numberList에서 p1 번째 항목으로 TextView 텍스트 설정 자식 레이아웃에 다른 TextView가 있습니다 날씨를 표시하고자하는 숫자가 홀수 또는 짝수 인 경우 그러나 여기에서 일어나는 계산에 의해 정의됩니다 지금, 나는 테이블 안에 칼럼을 추가하고 싶다 iteslf 내가 저장하고 싶은 날씨는 숫자가 홀수입니다

기존 데이터베이스를 업데이트해야합니다 앱을 처음 설치하는 경우 우리는 그 칼럼을 가질 필요가있다 그래서 isOddNumber라는 컬럼을 추가하고있다 정수형이다 또한 데이터를 삽입하는 동안 열을 업데이트하려고합니다

그래서, isOddNumber를 숫자 % 2와 같게 추가합니다 (실제로 우리는 숫자 % 2 == 1을 할 필요가 있습니다) 앱이 이전 기기에 설치되는 경우 (이전 앱 상단) 이전 버전의 데이터베이스가있는 그런 다음 여기에서 데이터베이스를 업데이트해야합니다 if (oldVersion == 1 및 newVersion == 2) 그런 다음 데이터베이스를 업데이트하려고합니다 데이터베이스에 더 많은 데이터가 있다면 업데이트가 더 오래 걸릴 수 있습니다 ANR 때문에 일어날 수있다 aviod에 업데이트를 수행하기 위해 AsyncTask를 사용할 것입니다

AsyncTask를 확장 한 UpdateDB 클래스 내부 통과 Void, Void, Void 회원을 구현해 보겠습니다 업데이트를하기 위해 데이터베이스 객체가 필요합니다 그래서, 나는 데이터베이스 객체를 매개 변수로 취하고있다 업데이트를 진행하는 동안 진행률 표시를 보여주고 싶습니다 그래서 AsyncTask의 매개 변수로 컨텍스트를 가져옵니다

내부에서 재정의 onPreExecute 및 onPostExecute 진행 표시 줄 표시 및 숨기기 AsyncTask 내부에 대화 상자 객체 만들기 lateinit var 대화 상자는 AlertDialog 유형입니다 insidePreExecute 안에 AlertDialogBuild가 생성됩니다 customView를 대화 상자 레이아웃으로 설정 마지막으로 create를 호출하고 대화 상자에 스트로 닝하여 빌더에서 대화 상자 객체를 작성합니다 이제 show 메소드를 호출하여 대화 상자를 표시 할 수 있습니다

onPostExecute에서 대화 상자를 숨길 필요가 있습니다 대화 상자가 초기화되었는지 확인한 다음 dialogdismiss를 호출합니다 db와 컨텍스트를 전달하여 여기에 AsyncTask를 호출합니다 여기서 db는 null 일 수 있습니다

그래서 (db! = null) 다음 AsyncTask 호출하면 확인하고 있어요 우리는 여기서 데이터베이스 업데이트를 할 필요가있다 우리는 무효를 돌려 줄 필요가있다 그래서 nullable 무효로 만들고 null을 반환합니다 먼저 열을 추가해야하는 업데이트를 수행합니다

그래서 나는 칼럼을 추가하여 테이블을 변경하고있다 ALTER TABLE "TableName", 여기에 NumberList를 주어야합니다 우리는 열을 추가하여 COLUM을 추가하려고합니다 isOddNumber는 INTEGER 유형입니다 이제 execSQL을 사용하여이 쿼리를 실행해야합니다

이 쿼리를 실행 한 후 테이블에 새로운 열이 생깁니다 그 전에 우리는 모든 데이터를 읽을 필요가 있습니다 val getAllData는 "SELECT * FROM NumberList"와 같습니다 이 쿼리를 rawQuery 메서드를 사용하여 실행하고 queryResult라는 변수에 저장합니다 queryResult를 사용한 후 닫아야합니다

그래서 close를 queryResult에서 호출합니다 여기에서 우리는 queryresult에서 데이터를 읽을 필요가 있습니다 그래서 getAllData에서 코드를 복사하고 여기에 붙여 넣습니다 이제 우리는 테이블에서 모든 데이터를 읽고 결과에 저장합니다 그 후 우리는 테이블을 바꾸고있다

이제 새 열을 업데이트해야합니다 여기 또한 실행 시간을 줄이기 위해 트랜잭션을 사용할 것이다 for 루프를 사용하여 결과 배열을 읽습니다 내부에서 ContentValues ​​만들기 내부에 새롭게 추가 된 열만 넣고 싶습니다 cv

put ( "isOddNumber", 결과 [i] 번호 % 2 == 1) 우리가 명시 적으로주고 싶다면 우리는 이렇게 줄 수 있습니다 result [i] 숫자 % 2 == 1 (잘못 입력 한 경우) 이제이 열을 업데이트하려고합니다 db

update 내부에서 전달해야합니다 테이블 이름, ContenValues, 클래스 및 위치 인수 어디서 클래스 "ID =?" where argument for "arrayOf (result [i] idtoString ())" 모든 데이터를 업데이트 한 후 우리는 트랜잭션을 성공으로 만들어야합니다 db

setTransactionSuccessful () 마지막으로 endTransaction을 호출해야합니다 endTransaction을 호출하지 않으면 트랜잭션이 커밋되지 않습니다 endTransaction을 호출하는 것을 잊지 마세요 dalay를 시뮬레이트하기 위해 스레드를 사용하여 10 초 지연을 설정 중입니다 당신은 여기서 볼 수 있습니다 oldVersion == 1 && newVersion == 2 우리는 UpdateDB를 호출하고 있습니다

그래서 나는 DB_VERSION을 2로 변경하고있다 또한 Number 객체에 isOddNumber를 추가합니다 getAllData에서 테이블에서 isOddNumber를 가져와야합니다 그래서 정수로 isOddNumber를 얻고 그것을 1과 비교합니다 이제 RecyclerView에서이 플래그를 사용해야합니다

우리는 여기서 데이터베이스 만 사용하고 있습니다 AsyncTask 때문에 업데이트하기 전에 데이터베이스를 읽습니다 나는 DBHandler의 객체를 생성하는 것을 피하기 위해 getWritableDatabase라는 더미 함수 호출 어디에서 쓸 수있는 데이터베이스를 반환 할 것인가? 이제 대화 상자는 업데이트를 완료 할 때까지 버튼을 누르는 것을 허용하지 않습니다 이제 응용 프로그램을 시작합니다 당신은 대화 상자를 보여주는 것을 볼 수 있습니다 우리는 지연을 10 초로했습니다

그래서 그 대화 상자를 10 초 동안 보여줍니다 "목록으로 이동"을 클릭하면 홀수와 짝수가 제대로 표시되는지 확인할 수 있습니다 데이터가 데이터베이스에 올바르게 업데이트됨을 의미합니다 이처럼 AsyncTask를 사용하여 데이터베이스를 업데이트 할 수 있습니다 더 많은 버전이 있으면 여기에 "else if"를 추가 할 수 있습니다

oldVersion == 1 && newVersion == 3을 확인할 수있는 곳 이처럼 여러 조건을 가질 수 있으며, 우리는 때때로 업데이트를 할 수 있습니다 이 비디오 녀석들을위한 모든 것 나를 지원하기를 원한다면 patreoncom/CodeAndroid에서 후원자가되어이를 지원할 수 있습니다 너가 좋아하길 바래 내 다음 비디오에서 뵙겠습니다 좋은 하루 되세요