본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] Database SQLite 에 대한 모든 것.

by 돼지왕 왕돼지 2012. 2. 21.
반응형

안녕하세요 돼지왕 왕돼지입니다.
오늘은 Android 에서 사용하는 Database, 즉 SQLite 에 대해 파헤쳐 보겠습니다.



도우미 클래스

도우미 클래스로 불리는 SQLiteOpenHelperDatabase의 create, update, delete 등의 관리를 쉽게 하도록 도와주는 클래스입니다.

 

SQLiteOpenHelper (Context context, String name, SQliteDatabase.CursorFactory factory, int version)
//  세번째 인수 factory 는 표준 cursor를 이용할 경우 null 로 지정 

 

 

도우미 객체는 다음과 같은 세가지 함수를 가지고 있으며, 보통 모두 다 implement 해줍니다.

 

onCreate()     // DB가 처음 만들어 질 때 호출. 여기서 테이블 생성 및 초기 레코드 삽입
onUpgrade()  //  DB를 업그레이드 할 때 호출. (DB version이 바뀌었을 때)
                     // 기존 테이블 삭제&새로 생성 하거나 ALTER TABLE 로 Schema 수정
onOpen()      // DB를 열 때 호출한다.

 





 
DB Operation.

SQLiteDatabase SQLiteOpenHelper.getReadableDatabase(); // DB 읽기. DB가 없다면 onCreate가 호출되고, version이 바뀌었다면 onUpgrade 호출
SQLiteDatabase SQLiteOpenHelper.getWritableDatabase();
// 읽고 쓰기 위해 DB 연다. 권한이 없거나 디스크가 가득 차면 실패

void SQLiteDatabase.close();
// DB를 닫는다.  

 

 

 

 

<example> 

 

WordDBHelper mHelper;
SQLiteDatabase db;
ContentValues row;
 
// DB insert
db = mHelper.getWritableDatabase();
row = new ContentValues();
row.put("eng", "boy");
row.put("han", "머스마");
db.insert("dic", null, row); // ContentValues를 이용한 삽입
db.execSQL("INSERT INTO dic VALUES (null, 'girl', '가시나');"); // Quert를 이용한 삽입
mHelper.close();
 
// DB delete
db = mHelper.getWritableDatabase();
db.delete("dic", null, null);
db.execSQL("DELTE FROM dic;");
mHelper.close();
 
// DB update
db = mHelper.getWritableDatabase();
row = new ContentValues();
row.put("han", "소년");
db.update("dic", row, "eng = 'boy'", null);
db.execSQL("UPDATE dic SET han='소년' WHERE eng = 'boy';");
mHelper.close();
 
// DB select
db = mHelper.getReadableDatabase();
Cursor cursor;
cursor = db.query("dic", new String[] {"eng", "han"}, null, null, null, null, null);
cursor = db.rawQuery("SELECT eng, han FROM dic", null);
String result="";
 
while(cursor.moveToNext()){
      String eng = cursor.getString(0); 
      String han = cursor.getString(1);
}
 
Cursor.close();
mHelper.close();
 
class WordDBHelper extends SQLiteOpenHelper{
       public WordDBHelper(Context context){
             super(context, "EngWord.db", null, 1);
       }
 
       public void onCreate(SQLiteDatabase db){
             db.execSQL("CREATE TABLE dic(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                                                        "eng TEXT, han TEXT);");
       }
 
       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
             db.execSQL("DROP TABLE IF EXISTS dic");
             onCreate(db);
       }
}

 

 


<SQLiteOpenHelper 를 사용하지 않고 DB 를 얻어오는 방법>

 

SQLiteDatabase Context.openOrCreateDatabase (String name, int mode,  SQLiteDatabase.CursorFactory factory)
// helper class 없이 db 생성

 

 

 


 

 



쿼리 실행 ( Query Execution )
 
ContentValues 클래스 이용하여 Update, Insert, Delete 명령 수행.

 

   void ContentValues.put (String key, Integer value)
   void ContentValues.put (String key, String value)
   void ContentValues.put (String key, Boolean value)
   // key 는 column name 


Query & SQLExecution

 

long SQLiteDatabase.insert (String table, String nullColumnHack, ContentValues values)
int delete (String table, String whereClause, String[] where Args)
int update (String table, ContentValues values, String whereClause, String[] whereArgs)
Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
 
void execSQL (String sql)
// DB 내용을 바꾸는 것에 대해서.
Cursor rawQuery(String sql)
// DB 내용 바꾸지 않고 정보만 가져옴. 

 


 
 

Cursor ( 커서 )

DB의 query 결과 Cursor 라는 pointer 의 개념의 object 로 받아온다.

Cursor의 method들

 

void close()
int getColumnCount()
int getColumnIndex( String columnName )
String getColumnName( int index )
int getCount()
int getInt( int index )
double getDouble( int index )
String getString( int index )
boolean moveToFirst()
boolean moveToLast()
boolean moveToNext()
boolean moveToPrevios()
boolean moveToPosition( int position )

 


-> 쿼리를 통해 얻어진 커서는 첫 레코드 "이전"을 가르킴. 그래서 moveTo~ 가 꼭 필요.
-> SQLite는 타입 점검이 느슨하여 정수도 string으로, string을 정수로도 읽을 수 있다.
-> Index는 0번부터 시작한다.





Cursor Binding ( 커서 바인딩 ) - SimpleCursorAdaptor

SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to)


<example>

 

ProductDBHelper mHelper = new ProductDBHelper (this);
SQLiteDatabase db = mHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM product", null);
startManagingCursor(cursor);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, new String[] {"name", "price"}, new int[] ); 
 
ListView list = (ListView)findViewById(R.id.list);
list.setAdapter(Adapter);
 
class ProductDBHelper extends SQliteOpenHelper{
    public ProductDBHelper(Context context){
        super(context, " Product.db", null, 1);
    }
 
    public void onCreate(SQLiteDatabase db){
        db.execSQL("CREATE TABLE product(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, price INTEGER);");
    }
 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        db.execSQL("DROP TABLE IF EXISTS product");
        onCreate(db);
    }
}

 

 
-> startManagingCursor는 액티비티의 생명주기에 맞춰 커서를 자동 관리. (종료시 함께 close)
 

[android] managedQuery 와 일반 query 의 차이점

 

 

반응형

댓글