데이터 저장 및 액세스 - SQLite 데이터베이스도 참조하세요.
이 섹션 소개:
이전 섹션을 공부한 후 이미 Android에서 SQLite의 기본 작업을 마스터했으며 이 섹션에서는 약간 더 발전된 사항, 데이터베이스 트랜잭션, 대용량 바이너리 데이터를 데이터베이스에 저장하는 방법 및 버전 업그레이드 시 데이터베이스를 처리하는 방법! 좋아요, 이제 이 섹션을 시작하겠습니다!
SQLite transaction
간단히 말하면: 트랜잭션에 작성된 모든 데이터베이스 작업이 성공하고 트랜잭션이 커밋됩니다. 그렇지 않으면 트랜잭션이 롤백됩니다. 즉, 이전 지점으로 돌아갑니다. 상태 - 데이터베이스 작업이 수행되지 않은 경우! 또한 앞서 data/data/<패키지 이름>/database/ 디렉터리에 있는 내용도 언급했습니다. 우리가 생성한 db 파일 외에도 데이터베이스가 트랜잭션을 지원할 수 있도록 하는 데 사용되는 xxx.db-journal 파일도 있습니다. 임시 로그 파일이 생성되었습니다!
2.SQLite는 대용량 바이너리 파일을 저장합니다
물론 일반적으로 사진, 오디오, 비디오 등과 같은 대용량 바이너리 파일을 데이터베이스에 저장하는 경우는 거의 없습니다. 저장 파일 경로이지만 항상 이상한 요구 사항이 있습니다. 어느 날 갑자기 이러한 파일을 데이터베이스에 저장하려고 합니다. 그림은 예시입니다. 그림을 SQLite에 저장하고, SQLite에서 그림을 읽어보세요!
3.SimpleCursorAdapter는 데이터베이스 데이터를 바인딩합니다
물론 재미로는 괜찮지만 사용하기 매우 간단하지만 사용하지 않는 것이 좋습니다! 사실, ContentProvider에 대해 이야기할 때 우리는 이것을 연락처 목록을 바인딩하는 데 사용했습니다! 여기서는 예시를 쓰지 않겠습니다. 핵심코드 바로가기! 필요한 경우 직접 수정해도 됩니다. 또한 요즘에는 데이터베이스를 직접 작성하는 경우가 거의 없습니다. , 일반적으로 ormlite, greenDao 등의 타사 프레임워크를 통해 고급 부분에서 다시 학습합니다~
4. 데이터베이스 업그레이드의 몇 가지 주요 사항
PS: 음, 이 부분은 수행하지 않았습니다. 그런데 항상 프로젝트 경험이 부족해서인지 회사 제품은 모두 포지셔닝 기반으로 되어 있어서 방금 다녀왔습니다. 프로젝트를 진행하면서 전임자가 남긴 코드는 다음과 같습니다. onCreate()가 DB를 생성한 다음 onUpgrade()가 이전 DB를 삭제한 다음 onCreate() 메소드를 다시 호출하세요! 여러 버전의 코드를 읽은 후 데이터베이스 업그레이드 작업이 없다는 것을 발견했습니다. 배울 것이 없습니다. 다음은 Xiaozhu의 정보 검토에서 나온 몇 가지 결론입니다. 잘못된 점이 있으면 지적해 주세요. 일부 타사 프레임워크에서 이미 이 작업을 수행했을 수도 있지만 시간 제약으로 인해 천천히 설명하지는 않겠습니다. 아시는 분은 메시지를 남겨주시면 됩니다. 감사합니다!
1) 데이터베이스 버전 업그레이드란? 업그레이드하는 방법?
답변: APP를 개발하고 데이터베이스를 사용하는 경우 데이터베이스 버전은 v1.0이라고 가정합니다. 이번 버전에서는 x.db 데이터베이스 파일을 생성하고, onCreate() 메소드를 통해 첫 번째 테이블을 생성했습니다. t_user에는 _id, user_id라는 두 개의 필드가 있습니다. 나중에 이번에는 user_name 필드를 추가하려고 합니다. 데이터베이스 테이블의 구조를 수정해야 하며, onUpgrade()에서 데이터베이스를 업데이트할 수 있습니다. 이 방법에서는 1을 2로 변경하는 등 사용자 정의 SQLiteOpenHelper를 인스턴스화할 때 버전 번호만 수정하면 됩니다. 이런 방식으로 onUpgrade() 메서드가 자동으로 호출됩니다! 또한 각 데이터베이스 버전에 대해 잘 수행해야 합니다. 해당 레코드(문서)는 다음과 유사합니다.
database version | andoid 해당 버전 | content |
---|---|---|
v1.0 | 1 | 첫 번째 버전에는 두 개의 필드가 포함됩니다.. . |
v1.1 | 2 | 데이터 보존, 새 user_name 필드 |
2) 궁금하신 점 및 해결 방법
① 애플리케이션이 업그레이드되면 데이터베이스 파일이 삭제되나요?
답변: 아니요! 데이터와 모든 것이 거기에 있습니다!
②테이블에서 필드를 삭제하거나 새 필드를 추가하려는 경우 원본 데이터가 그대로 남아 있나요?
답변: 네!
③방금 말씀하신 데이터베이스 버전을 데이터를 유지하지 않고 업데이트하는 조잡한 방법을 게시할 수 있나요?
A: 예, 여기에서는 타사 ormlite가 사용됩니다. 데이터베이스 생성 및 삭제를 위한 코드를 직접 작성할 수도 있습니다.
4예를 들어, 타사로 업그레이드한 경우 버전에서는 두 번째 버전에 테이블을 추가했고, 그리고 세 번째 버전에서도 테이블을 추가했고, 첫 번째 버전에서 세 번째 버전으로 직접 업그레이드한 사용자를 추가했기 때문에 두 번째 버전에는 거치지 않았습니다. 추가된 테이블이 없습니다. 어떻게 깨질 수 있나요?
답변: onUpgrade()에 switch()를 작성할 수 있습니다. 구조는 다음과 같습니다.
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int arg2, int arg3) { switch(arg2){ case 1: db.execSQL(第一个版本的建表语句); case 2: db.execSQL(第二个版本的建表语句); case 3: db.execSQL(第三个版本的建表语句); } }주의하면 여기에 break가 기록되지 않은 것을 알 수 있습니다. 데이터베이스가 업그레이드될 때마다 버전 간 업그레이드를 보장합니다. 모든 수정이 구현 가능합니다! 이렇게 하면 테이블 구조가 최신 상태로 유지됩니다! 또한 반드시 테이블을 생성하거나 테이블 구조를 수정하는 명령문은 아닙니다. 그것도 괜찮아요!
⑤ 기존 테이블의 디자인이 너무 나쁘고, 변경해야 할 필드도 많고, 변경해야 할 항목도 너무 많습니다. 새 테이블을 만들고 싶지만 테이블 이름이 동일해야 합니다 그리고. 일부 이전 데이터는 새 테이블에 저장되어야 합니다!
이 섹션 요약:답변: 하하, 무릎을 꿇겠습니다. 해결책은 다음과 같습니다.
1 이전 테이블의 이름을 임시 테이블로 변경합니다. ALTER TABLE User RENAME TO _temp_User; 2. 새 테이블 생성:
CREATE TABLE 사용자(u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));3. 데이터 가져오기;
INSERT INTO 사용자 SELECT u_id,u_name,"18" FROM _temp_User;//원본 테이블에 없으면 기본값을 설정합니다4. 임시 테이블을 삭제합니다.
DROP TABLE_temp_User;
좋아, 이 섹션에서는 SQLite 트랜잭션과 대규모 바이너리 저장소, SimpleCursorAdapter 및 데이터베이스 업그레이드에 대해 논의합니다. 몇 가지 문제가 조사되었으며 SQLite에 대해 당분간 제3자의 사용에 대해 많은 것을 배웠습니다. 고급 레벨에 도달하면 몇 가지 고급 주제를 함께 공부하겠습니다~ 이번 섹션은 여기까지입니다. 감사합니다~