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));
    }
   
   
}









크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/03 18:00 2010/11/03 18:00
, , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5614


절대 다가오는 위험으로부터 등을 돌리고 달아나려 해서는 안 된다.
그러면 위험은 배로 늘어난다.
그러나 당황하지 않고 즉시 정면 돌파 한다면 위험은 절반으로 줄어든다.
절대 어떤 것으로부터도 달아나지 마라. 절대로!
- 윈스턴 처칠

당장의 두려움, 당장의 귀찮음을 피하기 위해
현실을 직시하지 않고 회피하거나 뒤로 미루게 되면,
오히려 문제는 더 커지고, 손쓸 수 있는 방법도 점점 더 줄어들게 됩니다.
위험에 떳떳하게 맞서는 용기를 가진 사람에게 하늘은 길을 열어줍니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/03 08:36 2010/11/03 08:36
, ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5613

그때는 몰랐다

그때는 몰랐다.
길을 걷는다는 것과
길을 낸다는 것이 얼마나 다른 일인가를.
사람들은 간혹 내게 묻는다. 이런 아름다운 곳에
사니까 정말 행복하겠다고. 정말 보람있겠다고.
얼마나 좋으냐고. 근심걱정이 없겠다고.
얼추 맞는 말이다. 행복하고, 보람있다.
하지만 '세상에서 가장 평화롭고 행복한' 길을 내면서도,
나는 종종 외로워하고, 때로 분노하고, 절망한다.
사랑에 대한 갈증으로 고통스러워한다.


- 서명숙의《꼬닥꼬닥 걸어가는 이 길처럼》중에서 -


* 결코 남의 이야기 같지가 않아
저도 코끝이 시큰해집니다. 오로지 꿈 하나로
'제주올레' 길을 처음으로 낸 사람의 보람과 행복,
그러나 그에 못지 않은 고독과 고통을 누가 죄다 알겠습니까?
아침편지를 쓰고 옹달샘을 꿈꾸면서도 그때는 잘 몰랐습니다.
꿈을 꾼다는 것과 꿈을 이룬다는 것이 얼마나 다른 일인가를.
보람과 행복도 크지만 외로움과 고통도 크다는 것을.   
함께 가는 동반자의 힘이 얼마나 크고
감사한 일인지를...
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/03 08:35 2010/11/03 08:35
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5612


블로그 이미지

- 홍반장

Archives

Recent Trackbacks

Calendar

«   2010/11   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
Statistics Graph

Site Stats

Total hits:
241950
Today:
480
Yesterday:
1266