반응형
안녕하세요 돼지왕 왕돼지입니다.
오늘은 Android 에서 사용하는 Database, 즉 SQLite 에 대해 파헤쳐 보겠습니다.
도우미 클래스
도우미 클래스로 불리는 SQLiteOpenHelper 는 Database의 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 insertdb = 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 deletedb = mHelper.getWritableDatabase();db.delete("dic", null, null);db.execSQL("DELTE FROM dic;");mHelper.close();// DB updatedb = 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 selectdb = 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 명령 수행.
Query & SQLExecution
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 의 차이점
반응형
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] SharedPreference ( 쉐어드 프리퍼런스 ) 에 대한 모든 것. (0) | 2012.02.22 |
---|---|
[Android/안드로이드] Preference Activity (0) | 2012.02.21 |
[android] Content Provider ( 콘텐트 프로바이더 ) 에 대한 모든 것. (0) | 2012.02.20 |
[Android/안드로이드] CustomView 생성시 override 해야 할 function들 (17) | 2012.02.19 |
[Android/안드로이드] Activity 간의 통신. (2) | 2012.02.19 |
댓글