본문 바로가기
프로그래밍 놀이터/Database

[SQLite3] 09. 안드로이드와 데이터베이스

by 돼지왕왕돼지 2018. 5. 25.

[SQLite3] 09. 안드로이드와 데이터베이스


이 글은 "빠르게 활용하는 모바일 데이터베이스 SQLite3” 이란 글을 보며 필요한 내용만 정리한 글입니다.

자세한 내용은 책을 구매해서 보세요

Android DB, android sqlite, appendWhere, begintransaction, contentvalues, cursorfactory, data definition language, db 관련 클래스, DB 생성, DDL, endtransaction, execSQL, insertorthrow, mode_private, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE, nullcolumhack, openorcreatedatabase, query, rawQuery, setTables, setTransactionSuccessful, SQL 질의문 직접 수행하기, SQLException, sqlitedatabase, SQLiteQueryBuilder, try catch, [SQLite3] 09. 안드로이드와 데이터베이스, 권한, 기본적인 질의, 레코드 삭제, 레코드 수정, 레코드 입력, 롤백, 안드로이드와 데이터베이스, 조건이 포함된 질의, 조인 질의, 테이블 생성, 트랜잭션 중첩, 트랜잭션 처리, 파일 이름


-

안드로이드 플랫폼에서는 C 언어 기반의 SQLite3 lib 이 JNI 를 통해 제공되므로 SQLite3 C API 대신 안드로이드 플랫폼에서 제공하는 클래스와 메서드를 사용해야 한다.



1. DB 관련 클래스


DB 생성


-

Context.openOrCreateDatabase() 메서드를 사용해 DB 를 만들 수 있다.

DB 파일 이름, 권한, CursorFactory 를 인자로 전달한다.

반환값은 SQLiteDatabase 객체이다.


권한 부분은 아래 옵션을 갖는다.


MODE_PRIVATE : 해당 앱만 독점적으로 사용한다. (기본값)

MODE_WORLD_READABLE : 설치된 모든 앱에서 해당 DB 를 읽을 수 있다.

MODE_WORLD_WRITABLE : 설치된 모든 앱에서 해당 DB 에 쓸 수 있다.



-

DB 파일은 /data/data/<packageName>/databases/ 에 생성된다.



테이블 생성


테이블 생성과 같은 DDL(Data Definition Language)을 수행할 때는 SQLiteDatabase.execSQL()  메서드를 주로 사용하며, 인자로 SQL 구문을 String 타입으로 전달한다.



레코드 입력


어떤 테이블의 모든 컬럼이 NULL 입력이 가능하다고 하자.

이 경우 INSERT INTO suchTable; 과 같이 SQL 구문을 작성할 수 있지만 SQLite3 에서는 유효한 구문이 아니다.

이 대신 INSERT INTO suchTable(column) VALUES(NULL); 처럼 하나라도 값을 채워주어야 SQL 문이 정상적으로 수행한다.


이처럼 입력하는 레코드의 데이터가 빈 경우, 즉 ContentValues 객체에 put() 메서드로 입력된 값이 없는 경우에는 두 번째 인자인 nullColumnHack 에 문자열로 테이블의 한 컬럼을 지정해줘야 에러 없이 정상적으로 SQL 문이 수행된다.



-

insertOrThrow() 메서드는 insert() 메서드와 기본 동작 방식과 인자가 같지만 레코드 입력이 실패할 경우 SQLException 이 발생한다.



레코드 수정



레코드 삭제



트랜잭션 처리


안드로이드에서는 SQL 구문이 아닌 API 수준에서 트랜잭션을 처리한다.

SQLiteDatabase.beginTransaction() 메서드를 호출해 트랜잭션을 시작하며, 이 때 안드로이드 API 를 이용한 트랜잭션 중첩이 가능하다.

DB 변경 작업은 try/catch 블럭 내에서 수행하며, SQLiteDatabase.setTransactionSuccessful() 메서드를 호출해 트랜잭션이 정상적으로 수행됐음을 표시한다.

setTransactionSuccessful() 메서드를 호출하지 않으면 변경된 작업 내용은 endTransaction() 이 호출되는 트랜잭션 종료 시점에서 롤백된다.

변경 작업 도중 에러가 발생하면 catch 블록에서 에러를 처리하게 되며, 어떤 경우에도 endTransaction() 메서드가 호출되어 트랜잭션이 종료되도록 해야 한다.



기본적인 질의



조건이 포함된 질의



조인 질의


테이블을 조인하는 경우처럼 복잡한 질의문을 작성할 때는 SQLiteQueryBuilder 클래스를 이용한다.

SQLiteQueryBuilder 클래스의 setTables() 메서드에는 조인할 모든 테이블의 이름을, appendWhere() 메서드에서는 조인 조건을 설정하고 query() 메서드를 통해 질의를 수행한다.



SQL 질의문 직접 수행하기


query() 계열 함수를 이용하면 단순히 각 인자를 전달해서 레코드를 조회할 수 있지만 입력해야 할 인자가 많아서 코드가 장황해지는 문제가 있다.

SQL 구문에 익숙한 개발자라면 rawQuery() 메서드로 SQL 질의문을 그대로 사용하는 편이 나중에 유지보수하기도 쉽고 코드도 간결해진다.




2. 안드로이드 DB 앱


SQLiteCommander 앱의 특징



프로젝트 생성 및 GUI 제작



자바 코드 작성




댓글0