Android에서 SQLite를 사용하여 테이블 생성시 문제가 생겼던 점을 포스팅합니다.
SQLiteOpenHelper를 상속받은 클래스를 사용하여 데이터베이스 파일을 관리하지 않으면 생길 수 있는 상황인 듯합니다.
다음과 같은 구조의 테이블을 사용하여 앱을 만들다가
레코드이름 | 타입 |
id | integer |
image | blob |
text | text |
기존 테이블을 삭제하고 날짜 레코드를 추가했습니다.
문제 없이 동작하는 듯했습니다.
레코드이름 | 타입 |
id | integer |
image | blob |
text | text |
date | date |
앱을 새로 설치할때 문제가 없는지 테스트해보다가 버그(?)를 찾았네요.
분명 date 타입이 추가된 테이블을 새로 생성하도록 했는데 date가 없는 테이블이 데이터베이스에 있다고 에러가 났습니다.
확인해보니 데이블을 생성하기 전에 기존 테이블을 삭제해야 에러가 안나더군요.
앱이 최초 실행될 때에만 기존 테이블이 있는 경우 삭제해주면 해결되는 상황이었습니다.
그래서 대부분의 앱들이 재설치시 기존 데이터가 날라간다고 하나봅니다.
알고보니 앱을 삭제해도 SQLite에서 생성한 데이터베이스 파일은 남는다는 군요.
안드로이드 스튜디오에서 설치하는 과정에서도 데이터베이스 파일이 남는 듯합니다.
SQLiteOpenHelper를 상속받은 클래스를 사용해서 해결했습니다.
앱이 새로 설치된 후에만 이 클래스의 onCreate 메소드에서 테이블을 생성하더군요.
안드로이드 스튜디오에서 설치를 다시 하거나 apk 파일로 만들어서 설치를 다시 진행해도 새로 생성하지 않습니다.
기존에 있던 테이블을 그대로 사용합니다. 플레이스토어에서 다운받아 설치하면 어떨지는 테스트 못해봤습니다.
사용한 SQLiteOpenHelper를 상속받은 클래스와 MainActivity에서 사용하는 방법을 남겨둡니다.
기존에 사용하던 코드입니다.
db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
db.close(); |
다음처럼 변경해서 사용했습니다.
1. 다음 2개의 변수를 선언합니다.
SQLiteHelper mSQLiteHelper; |
2. onCreate 메소드에서 SQLiteHelper 객체를 생성합니다.
mSQLiteHelper = new SQLiteHelper(this); |
3. DB에서 읽어올때 다음처럼 합니다.
mDb = mSQLiteHelper.getReadableDatabase(); |
4. DB에 쓸 때 다음처럼 합니다.
mDb = mSQLiteHelper.getWritableDatabase(); |
SQLiteHelper .java
테이블에 새로운 레코드를 추가시 기존 데이터는 남겨두고 할 수 있는 방법은 아직 테스트 못했습니다.
주석한 부분을 참고하여 진행하면 될듯합니다.
package com.tistory.webnautes.imagesaveinsqlite; |
참고
https://thebhwgroup.com/blog/how-android-sqlite-onupgrade
최초 작성 2019. 2. 28
'Android > SQLite' 카테고리의 다른 글
간단한 Android Sqlite 예제 ( DB생성,테이블 생성, 데이터 입력, 테이터 보여주기) (20) | 2019.02.12 |
---|
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!