(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 데이터베이스 객체 |
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 신버전 번호 |
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 텍스트 박스의 문자열 |
SQLiteDatabase 클래스
int update(String tableName, ContentValues values, String where, String[] whereArgs) |
|
기능 : 테이블 레코드의 갱신 인수 : tableName 테이블명 values 레코드 정보 where where 파라미터 whereArgs where 파라미터 반환값 : 갱신한 레코드 수 |
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 객체 |
반환값은 Cursor 객체로 구해지는데, Cursor 객체는 내부적으로 다수의 레코드를 저장하고 있습니다. getCount() 메소드로 레코드 수, getColumnCount() 메소드로 컬럼 수를 구할 수 있습니다.
Cursor 클래스
int getCount() |
|
기능 : 레코드 수 구하기 반환값 : 레코드 수 |
int getColumnCount() |
|
기능 : 컬럼 수 구하기 반환값 :컬럼 수 |
커서에서 선두의 레코드를 지시하는 때에는 moveToFirst() 메소드를 부릅니다.
Cursor 클래스
boolean moveToFirst() |
|
기능 : 커서에서 선두 레코드를 지시한다. 반환값 : 성공 또는 실패 |
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)); } } |
Posted by 홍반장