본문 바로가기

내가 하는일/JAVA

Android SQLlite 예제

SQLite
(1) 데이터베이스의 정의
: Android에서 데이터베이스로 접근하려면, SQLiteOpenHelper 클래스를 상속한 데이터베이스 헬퍼를 정의하고 이것을 이용한다. 이 헬퍼는 데이터베이스의 생성 및 업그레이드를 관리한다.
SQLiteOpeHelper 클래스를 상혹한 클래느는 다음의 메소드를 오버라이드한다.

오버라이드하는 메소드 메소드의 호출
onCreate() 메소드
onUpgrade() 메소드
데이터베이스 생성 시 호출.
데이터베이스 업그레이드 시 호출.

(2) 데이터베이스 헬퍼 생성자

SQLiteOpenHepler 클래스

SQLiteOpenHelper(Context context, String fileName, SQLiteDatabase.CursorFactory factory, int version)
기능 : SQLiteOpenHelper 클래스의 생성자
인수 : context 컨텍스트
fileName 데이터베이스 파일명
factory 팩토리
version 버전
데이터베이스 이름에는 저장할 곳의 파일명을 지정합니다.
/data/data/패키지명/databases/데이터베이스 파일명 ( test.db) 에 저장됩니다.
팩토리는 사용하지 않으면 null을 지정하고, 버전은 1을 지정.

(3) 데이터베이스의 생성 : onCreate() 메소드를 호출
SQLiteOpenHelper 클래스

void onCreate(SQLiteDatabase db)
기능 : 데이터베이스 생성 시 호출
인수 : db 데이터베이스 객체
onCreate() 메소드 내에서는 SQL명령으로 테이블을 생성하고 있습니다. test 라는 테이블명에서 id 와 info 라는 컬럼을 갖고 있는 테이블을 생성하는 SQL 명령은 아래와 같습니다. 컬럼의 형은 문자열이므로 컬럼명 뒤에 text라고 기술하고, id 는 다른 ID 와 중복되지 않는 기본키이므로 primary key 라고 추가합니다.
create table id not exists text(id text primary key, info text)

SQL명령을 실행하려면 SQLtestDatabase 클래스의 execSQL()을 사용합니다.
SQLiteDatabase 클래스

void execSQL(String Sql)
기능 : SQL 명령의 실행
인수 : sql SQL명령

(4) 데이터베이스의 업그레이드
: 데이터베이스는 버전업 시 데이터베이스 구조를 변환하지 않으면 업그레이드가 안 되는 경우가 있습니다. 필요로 하는 버전에 이상이 있을 경우 이 onUpdate() 메소드가 불리므로, 이 메소드 내에서 구버전 번호와 신버전 번호의 정보로부터 데이터베이스 구조의 변환을 실행합니다.
SQLiteOpenHelper 클래스

void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
기능 : 데이터베이스를 업그레이드한 때
인수 : db 데이터베이스 객체
oldVersion 구버전 번호
newVersion 신버전 번호
다음으로, SQL명령으로 테이블을 삭제한 후 onCreate() 메소드를 호출하여 테이블을 생성합니다. test 라는 이름의 테이블을 삭제할 SQL명령은 다음과 같습니다.
drop table if exists test

(5) 데이터베이스 객체의 취득
: 메인이 되는 SQLiteEx 클래스의 개체에서는 먼저 정의한 데이터베이스 헬퍼를 이용하는 SQLiteDatabase 형 데이터베이스객체를 구합니다. 프로그램 내에서는 이 객체를 사용해서 데이터베이스의 조작을 실행합니다. 데이터베이스 객체를 구하려면 DBHelper 객첼르 생성한 후 getWritableDatabase() 메소드를 호출합니다.
SQLiteOpenHelper 클래스

SQLiteDatabase getWritableDatabase()
기능 : 데이터베이스 객체의 취득
인수 :데이터베이스 객체

(6) 데이터베이스의 쓰기
: 데이터베이스의 쓰기를 실행하려면 Content Values 클래스로 갱신하는 레코드 정보를 작성합니다. Content Values 객체를 생성한 후 put() 메소드로 컬럼명과 값을 세트로 추가합니다.
ContentValues 클래스

void put(String colName, String value)
기능 : 레코드 정보에 컬럼명과 값 추가
인수 : colName 컬럼명
value 값
이 프로그램에서는 다음의 칼럼을 추가하고 있습니다.
컬러명

id
info
0
텍스트 박스의 문자열
데이터 객체의 update() 메소드에 이 레코드 정보를 건네주는 것에 의해서, id[0]을 갖는 레코드의 info가 텍스트 박스의 문자로 덧쓰게 됩니다.
SQLiteDatabase 클래스

int update(String tableName, ContentValues values, String where, String[] whereArgs)
기능 : 테이블 레코드의 갱신
인수 : tableName 테이블명
values 레코드 정보
where where 파라미터
whereArgs where 파라미터
반환값 : 갱신한 레코드 수
반환값 레코드 수가 0이 될 때는 id[0] 이 존재하지 않는다고 간주하고, insert() 메소드로 테이블에 레코드를 삽입한다.
SQLiteDatabase 클래스

long insert(String tableName, String nullColumnHack, ContentValues values)
기능 : 테이블의 레코드 추가
인수 : tableName 테이블명
nullColumnHack NULL값
values 레코드 정보
반환값 : 레코드 ID

(7) 데이터베이스로부터 읽기
: 데이터베이스로부터 읽기를 실행하려면 데이터베이스 객체의 query() 메소드를 사용합니다.
SQLiteDatabase 클래스

Cursor query(String tableName, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
기능 : 데이터베이스로부터 읽기
인수 : tableName 테이블명
columns 컬럼명의 배열
selection selection parameter
selectArgs selection parameter factor
groupBy groupBy parameter
having having parameter
orderBy orderBy parameter
limit limit parameter
반환값 : Cursor 객체
selection, groupBy, having, orderBy, limit 파라미터는 SQLite의 query 명령 파라미터입니다. 이번에는 id가 0 인것만을 취득하고 싶기 때문에 selection 파라미터에 "id=0" 을 지정하고 있습니다.
반환값은 Cursor 객체로 구해지는데, Cursor 객체는 내부적으로 다수의 레코드를 저장하고 있습니다. getCount() 메소드로 레코드 수, getColumnCount() 메소드로 컬럼 수를 구할 수 있습니다.

Cursor 클래스

int getCount()
기능 : 레코드 수 구하기
반환값 : 레코드 수
Cursor 클래스

int getColumnCount()
기능 : 컬럼 수 구하기
반환값 :컬럼 수
Cursor 객체는, 자장하는 레코드 안의 조작대상을 지시하는 정보(커서)를 갖습니다.
커서에서 선두의 레코드를 지시하는 때에는 moveToFirst() 메소드를 부릅니다.
Cursor 클래스

boolean moveToFirst()
기능 : 커서에서 선두 레코드를 지시한다.
반환값 : 성공 또는 실패
그리고 나서, getString() 메소드 등을 부르는 것으로 레코드 내의 컬럼이 지시하는 값을 수하는 것이 가능합니다.
Cursor 클래스

String getString(int colIdx)
기능 : String 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : String 형의 값

double getDouble(int colIdx)
기능 : double 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : double 형의 값

float getFloat(int colIdx)
기능 : float 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : float 형의 값

int getInt(int colIdx)
기능 : int 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : int 형의 값

long getLong(int colIdx)
기능 : long 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : long 형의 값

short getShort(int colIdx)
기능 : short 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : short 형의 값

여기에서는 컬럼1(0부터 시작하므로 2열 째) 값을 String 형으로 얻고 있습니다.
마지막으로, Cursor 객체의 close() 메소드를 호출하여 Cursor 를 종료합니다.

------------- SQLiteEx.java ------------------------
package com.froglamb.sqliteex;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

public class SQLiteEx extends Activity implements View.OnClickListener{

private final static String DB_NAME = "test.db"; // DB name
private final static String DB_TABLE = "test"; // table name
private final static int DB_VERSION = 1; // Version

private EditText editText;
private Button btnWrite;
private Button btnRead;
private SQLiteDatabase db;

// 초기화
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_NO_TITLE);

// 레이아웃의 생성
LinearLayout layout = new LinearLayout(this);
layout.setBackgroundColor(Color.rgb(255, 255, 255));
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);

// 텍스트 박스의 생성
editText = new EditText(this);
editText.setText("", EditText.BufferType.NORMAL);
setLLParams(editText, 240, 50);
layout.addView(editText);

// 쓰기 버튼의 생성
btnWrite = new Button(this);
btnWrite.setText("쓰기");
btnWrite.setOnClickListener(this);
setLLParams(btnWrite);
layout.addView(btnWrite);

// 일기 버튼의 생성
btnRead = new Button(this);
btnRead.setText("읽 기");
btnRead.setOnClickListener(this);
setLLParams(btnRead);
layout.addView(btnRead);

// 데이터베이스 객체 구하기 (5)
DBHelper dbHelper = new DBHelper(this);
db = dbHelper.getWritableDatabase();
}

// 버튼 클릭 이벤트 처리
public void onClick(View v){
if ( v == btnWrite) {
try {
String str = editText.getText().toString();
writeDB(str);
} catch (Exception e) {
showDialog(this, "Error", "Write Error");
}
} else if ( v == btnRead) {
try {
String str = readDB();
editText.setText(str);
} catch (Exception e) {
showDialog(this, "Error", "Read Error");
}
}
}

// 데이터베이스의 쓰기 (6)
private void writeDB(String str) throws Exception{
ContentValues values = new ContentValues();
values.put("id", "0");
values.put("info", "info");
int colNum = db.update(DB_TABLE, values, null, null);
if( colNum == 0 ) db.insert(DB_TABLE, "", values);
}

private String readDB() throws Exception{
Cursor c = db.query(DB_TABLE, new String[] {"id","info"}, "id='0'", null, null, null, null);
if ( c.getCount() == 0 ) {
throw new Exception();
}
c.moveToFirst();
String str = c.getString(1);
c.close();
return str;
}


// 데이터베이스 헬퍼 정의 (1)
private static class DBHelper extends SQLiteOpenHelper{
// 데이터베이스 헬퍼 생성자 (2)
public DBHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
}

// 데이터베이스의 생성 (3)
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(
"create table if not exists " +
DB_TABLE + " (id text primary key, info text)"
);
}

// 데이터베이스의 업그레이드 (4)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL(
"drop table if exists " + DB_NAME
);
onCreate(db);
}
}


// 대화상자 표시
private static void showDialog(final Activity activity, String title, String text){
AlertDialog.Builder ad = new AlertDialog.Builder(activity);
ad.setTitle(title);
ad.setMessage(text);
ad.setPositiveButton("OK", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int whichButton){
activity.setResult(Activity.RESULT_OK);
}
});
ad.create();
ad.show();
}

// 리니어 레이아웃의 파라미터 지정
private static void setLLParams(View view){
view.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
}

// 리니어 레이아웃의 파라미터 지정
private static void setLLParams(View view, int w, int h){
view.setLayoutParams(new LinearLayout.LayoutParams(w, h));
}


}

'내가 하는일 > JAVA' 카테고리의 다른 글

android sqlite 사용하기  (0) 2011.08.17
sqllite3 데몬 사용하기 ㄱㄱ씽  (0) 2011.08.17
이클립스 SVN 64비트  (0) 2011.05.02
국내외 OPEN API  (0) 2011.04.30
Android Add on 설치시 액세스 권한 문제  (0) 2011.04.22