1. SQLite 의특징 - 오픈소스 - 최소한의라이브러리만으로동작 - 관리유저나설정파일등이불필요 - 원자성 (atomicity), 일관성 (consistency), 독립성 (isolation), 영속성 (durabitiy) 이라는데이터베이스에필요한특성을갖추고있다. - SQL92에서정의된명령어의대부분이용가능, 하나의데이터베이스가하나의파일에저장 2. 어플리케이션개발시 SQLite 사용 - 애플리게이션이작성한 SQLite의데이터베이스는 /data/data/< 패키지명 >/databases 디렉토리에작성됨 - 하나의애플리케이션에대해서하나의디렉토리가할당. 데이터베이스는다른애플리케이션이읽고쓰기는할수없습니다. 그경우는 Content provider의기능을이용 - 애플리케이션이작성한데이터베이스를조작하고자할때는 /system/xbin 디렉터리에있는 sqite3 명령어를사용. 3. SQLite 사용시기본사항 1) 테이블의작성과삭제 Create [TEMP] TABLE < 테이블명 > (Column 정의, [ 테이블제약 ]); TEMP( 또는 TEMPORARY) 키워드를지정하면일시적인테이블을작성한다. 이테이블은데이터베 이스를 close 했을때에자동적으로삭제 SQLite 의 Storage Type Storage Type INTEGER REAL TEXT 내용최대 8바이트의정수값최대 8바이트의부동소수점수치 UTF-8의문자열 1
BLOB NULL Binary 데이터 값이존재하지않음 테이블의작성예 Create table contact_list( _id integer primary key autoincrement, name text not null, tel text not null default unknown, unique (name, tel), check(length(tel)>=3)); ); * 외래키는지원하지않음 테이블삭제 Drop 명령어사용 drop table 테이블명 ; 2) 테이블명의변경과컬럼추가 테이블명의변경에는 ALTER 명령어의 RENATE TO 를사용 alter table 테이블명 renamte to 새로운테이블명 ; 테이블의 column 추가에는 alter 명령어의 add column 을사용 alter table 테이블명 add column 컬럼정의 ; 3) SQLite 의내장함수 (Buit-in Function) 내장함수 (Built-in Function) 함수 개요 min(x,y,,) 최소값을반환한다. 2
max(x,y,,) 최대값을반환한다. typeof(x) 데이터의형을반환한다. lenth(x) 문자열의길이를반환한다. substr(x,y,z) X의문자열의 Y번째에서 Z문자의길이의문자열을반환한다. abs(x) 절대값을반환한다. round(x,y) X의수치를소수점이하 Y에서둥글게하다. upper(x) 대문자로변환하다. lower(x) 소문자로변환하다. coalesce(x,y,,) 최초의 NULL이아닌값을반환한다. hex(x) 문자열을 16진수표기로반환한다. Ifnull00,Y, (X) 최초의 NULL이아닌값을반환한다. random() Radom한값을반환한다. randomblob(x) X바이트의 random한값의열을반환한다. nullif(x,y) 2개의값이다르면최초의값을반환한다. 같아면 NULL을반환한다. sqlite_version() SQLite의버전을반환한다. quote(x) 문자열을 SQL의문자열로삽입할수있도록 escape처리를실행한다. last_insert_rowid() 마지막에삽입한레코드의 ID를반환한다. sum(x,y,,) NULL이아닌행의값의합계를반환한다. 행이없는경우 NULL을 반환한다. total(x,y,,) NULL이아닌행의값의합계를반환다. 행이없는경우 0를반환한 다. avg(x,y,,) NULL이아닌행의값의평균을반환한다. 행이없는경우 NULL을 반환한다. count(x) 그륩안에서 X가 NULL이아닌행의행수를반환한다. count(*) 그룹별의행수를반환한다. 4. SQLite 데이터베이스이용하기 1) SQLiteOpenHelper 데이터베이스를생성하고오픈하려면 SQLiteOpenHelper 객체를사용한다. SQLiteOpenHelper 클 래스는애플리케이션에서요구하는내용에따라데이터베이스를생성하거나업그레이드하는기능 제공 3
public class DatabaseHelper extends SQLiteOpenHelper{ // 생성자 public DatabaseHelper (Context context){ super(context, "dbtest", null, 1); //context : Activity등의 Context 인스턴스 //dbtest : 데이터베이스의이름 //null : 커서팩토리 ( 보통 null지정 ) //1 : 데이터베이스스키마버전 public void oncreate(sqlitedatabase db){ // 테이블을생성하고초기데이터를추가 String table_sql = "create Table test( _id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL);"; db.execsql(table_sql); public void onupgrade(sqlitedatabase db, int oldversion, int newversion){ // 버전번호를확인해서새로운스키마로적절하게업그레이드함 db.execsql("drop TABLE IF EXISTS test"); oncreate(db); //oncreate 메소드를호출해서새로 table 셋팅 2) 데이터추가 ContentValues cv = new ContentValues(); cv.put( title, 즐거운하루 ); cv.put( name, 홍길동 ); db.insert( member, title, cv); 3) 데이터업데이트 ContentValues re = new ContentValues(); re.put( name, 홍길동 ); 4
String[] params = new String[] { dragon ; db.update( member, re, userid=?, params); 4) 데이터삭제 String[] params = new String[]{userid; db.delete( member, userid=?, params); 5) 데이터불러오기 1) rawquery() 메소드를사용해 SELECT 구문을직접실행 Cursor c = db.rawquery( SELECT name FROM sqlite_master where type= table AND name= constants, null); 2) query() 메소드를인자로각부분의값을넘겨실행 public Cursor query(string table, String[] columns, String selection, String[] selcetionargs, String groupby, String having, String orderby, String limit) - table : 대상테이블이름 - columns : 값을가져올컬럼이름의배열 (null : 모든열 ) - selection : WHERE 구문. 물음표를사용해인자의위치를지정할수있음 (null : 모든레코드 ) - selectionargs : WHERE 구문에들어가는인자값 - groupby : GROUP BY 구문 (null : 미사용 ) - orderby : ORDER BY 구문 (null : 미사용 ) - limit : 레코드수지정 (null : 미사용 ) 3) SQLiteQueryBuilder 클래스의 query() 메소드이용 6) 커서의활용 5
movetofirst movetonext movetolast movetoprevious movetoposition getposition getcount getcolumncount getcolumnindex getcolumnname getcolumnnames isfirst islast isbeforefirst isafterlast getstring() getint() requery() close() 가장처음에위치한레코드로커서를이동커서를다음행으로옮김가장마지막에위치한레코드로커서를이동이전레코드로커서를이동특정레코드로커서를이동커서가현재가리키고있는위치를반환전체결과건수가몇개인지확인컬럼들의전체개수를반환특정컬럼번호조회특정인덱스값에해당하는컬럼이름을반환결과에포함된전체컬럼이름커서가첫번째레코드에위치하는지를반환커서가마지막레코드에위치하는지를반환커서가첫번째레코드의앞에위치하는지를반환커서가마지막레코드의뒤에위치하는지를반환컬럼값반환쿼리를재실행커서가확보한자원을모두해제 7) 트랜잭션 (Transaction) 다루기 여러데이터베이스연산이반드시모두성공해야하는경우가있다. 그런경우, 연산들중하나라도실패하면연산모두를없던일로철회해야한다. 하지만모든연산이성공한다면, 비로소연산결과가데이터베이스에실제로반영된다. 이와같이데이터베이스의무결성이보장되는상태에서요청된연산들을완수하기위한기본작업단위를 트랜잭션 (Transaction) 이라고한다. mdatabase.begintransaction(); try{ mdatabase.settransactionsuccessful(); catch(exception e){ finally{ 6
mdatabase.endtransaction(); 5. ADB 셸을이용한데이터베이스연결하기 1. 데이터베이스연결 c:\>adb shell # sqlite3 /data/data/com.android.sql/databases/daily_memo.db SQLite version 3.5.9 Enter.help for instructions Sqlite> 2. 사용가능한데이터베이스나열 sqlite>.databases 3. 사용가능한테이블나열 sqlite>.table 4. 종료 sqlite>.quit 또는 sqlite>.exit 7