Gooday Note Scrap Source Android login
 
작성일 : 11-04-09 20:47
안드로이드에서 데이터 다루기 (SQLiteDataBase)
 글쓴이 : 기리
조회 : 4,788   추천 : 0   비추천 : 0  
   http://sje0114121.blog.me/150105796631 [1595]
   http://blog.naver.com/onamt?Redirect=Log&logNo=70080739940 [1135]
안드로이드에서 데이터 다루기 (SQLiteDataBase)

databases를 생성하고, 열고, 데이터를 넣고, query를 통해서 정보를 받아오는 작업은 아래 두 클래스를 통해 가능하다.

 

SQLiteDatabase class
: DB를 다루는 작업(insert, update, query, delete)를 담당
SQLiteOpenHelper class

: DB의 생성, 열기, 업그레이드를 담당

 

이러한 클래스 내의 method를 통해 직접 DB를 생성, 수정, query 수행 가능하지만 그렇게 할 경우 코드상에 DB 구조도 들어나고, 코드를 이해하기 어려움
내가 사용할 DB에 맞게끔 database adapter를 생성하고 이를 통해 DB를 관리 => DB Adapter 필요!

 

DB Adapter의 구조
- 필드 이름들
- 데이터베이스 초기화에 필요한 SQL 문장들
- 데이터베이스 정보 (테이블 이름, 데이터베이스 이름 등)
- 헬퍼 클래스 (SQLiteOpenHelper; 데이터베이스 열기/닫기를 담당)
- 헬퍼 클래스의 인스턴스
- 데이터베이스 (SQLiteDatabase)의 인스턴스
- 데이터베이스 작업에 필요한 메소드들


 

먼저 실습으로 생성된 member.db를 열어보기위해서 아래 링크에서 윈도우에서 db 내용을 볼수있는 설치파일을 설치한다.

Download : http://www.sqliteexpert.com/SQLiteExpertPersSetup.exe

 

- Main 코드

 

 DB Adapter를 만들고 나면 Main.java코드는 참 심플해진다.

 name과 전화번호 editbox가 두개 있고, 등록버튼을 누를때마다 db에 그 값들을 넣는 예제이다.

 거기에 MemberListActivity까지 가세하면 등록버튼이 눌리었을때 startActivity로 MemberListActivity가 실행되면서 현재 DB의 정보들을 리스트뷰에 뿌려준다. Main에서는 DB에 ContentValues를 이용해 data를 넣는 법을 배웠다면, MemberListActivity.java에서는 DB에 query를 하고 cursor를 움직이면서 값을 받아와 list에 넣어주는 것을 볼 수 있다. 여기에서는 name과 addr이 모두 String이라 cursor.getString()으로 가져오지만, 실제 레코드값이 long타입이라면

cursor.getLong(1); 이런식으로 가져오셔야합니다. 그 안에 들어간 숫자인자는 인덱스를 나타냅니다.

 

- MemberListActivity.java

 

그러면 가장 중요한 DB Adapter코드를 볼까요?

DB Adapter클래스를 하나 둬서 SQLiteDatabase와 SQLiteOpenHelper 등을 모두 멤버로 가지고

각각 호출하는 번거로움을 덜고, 한 곳에서 db관련된 모든 기능을 하게 해줘서 편리한 것 같습니다.

 

package com.sds.lecture.data;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

 

// DBMS를 도와주는 util클래스로 가정
public class DBAdapter {
 private DatabaseHelper mHelper;  // SQLiteOpenHelper : db create, open, version upgrade
 private SQLiteDatabase mDb;      // SQLiteDatabase : insert, query, delete, update
 
 private static final String DATABASE_NAME = "member.db";  // db 이름
 private static final int DATABASE_VERSION = 3;  // db버젼
 private static String SQL_TABLE_CREATE;   

 private static String TABLE_NAME;

 

 // 여러 테이블을 이용할 경우 아래처럼 테이블을 생성하기 위한 sql만 담아서 범용적으로
 // DBAdapter 클래스를 사용하는게 좋다.
 public static final String SQL_CREATE_MEMBER =
  "create table member (no integer primary key autoincrement,"
  + " name text not null,"
  + " addr text not null"
  + ")";
 
 private final Context mCxt;

 // DB를 open, update, drop 시키는 역할의 SQLiteOpenHelper 클래스
 private static class DatabaseHelper extends SQLiteOpenHelper {

  public DatabaseHelper(Context context) {
   super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }

  public DatabaseHelper(Context context, String name,
    CursorFactory factory, int version) {
   super(context, name, factory, version);
  }

 

  // Helper의 기능인 create, open, version upgrade를 진행

  @Override
  public void onCreate(SQLiteDatabase db) {
   // TODO Auto-generated method stub
   db.execSQL(SQL_TABLE_CREATE);
  }

  @Override
  public void onOpen(SQLiteDatabase db) {
   // TODO Auto-generated method stub
   super.onOpen(db);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
   db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
   onCreate(db);
  }
  
 }
 
 // Main에서 context와 sql명, tableName을 전해주면서 new할 경우 호출된다.

// DBAdapter를 이용하고자 하는 곳에서 생성자에 table 생성 sql과 table명만 주고 이용해라.
 public DBAdapter(Context cxt, String sql, String tableName) {
  this.mCxt = cxt;
  SQL_TABLE_CREATE = sql;
  TABLE_NAME = tableName;
 }
 
 public DBAdapter open() throws SQLException {
  // 외부에서 db를 사용하겠다고 요청이 들어오면 Helper를 이용해서 db를 open하고
  // 자신의 클래스를 리턴
  mHelper = new DatabaseHelper(mCxt);  // SQLiteOpenHelper에게 context를 넘겨준다.
  mDb = mHelper.getWritableDatabase();
  return this;
 }
 
 public void close() {
  mHelper.close();
 }
 

// insert, delete, select, update의 db기본 기능 수행
 public long insertTable(ContentValues values) {
  return mDb.insert(TABLE_NAME, null, values);
 }
 
 public boolean deleteTable(String pkColumn, long pkData) {
  return mDb.delete(TABLE_NAME, pkColumn + "=" + pkData, null) > 0;
 }
 
 public Cursor selectTable(String[] columns, String selection,
   String[] selectionArgs, String groupBy,
   String having, String orderBy) {
  return mDb.query(TABLE_NAME, columns, selection, selectionArgs, groupBy, having, orderBy);
 }
 
 public boolean updateTable(ContentValues values, String pkColumn, long pkData) {
  return mDb.update(TABLE_NAME, values, pkColumn + "=" + pkData, null) > 0;
 }
}

 

실행하고나면 DDMS의 data/data/패키지명 으로 가보시면 databases폴더밑에 member.db가 생깁니다.

오른쪽 위에 pull a file from the device버튼 누르시면 현재 윈도우컴퓨터에 저장하실 수 있으니 아까 설치하신 db viewer로도 데이터 확인하실 수 있어요.^^

 

예전에 다 배운건데 못쫓아가고 직접 천천히 읽어보고 실습해보니 이제 DB가 어느정도 약간 감이 잡히는 거 같네요. 흐흐~

실습결과 화면은 http://sje0114121.blog.me/150089234033 를 참조하세요~


기리 11-04-09 22:00
 
기리 11-04-09 22:29
 
* 데이터베이스 어뎁터 생성 및 사용

http://androcat.egloos.com/1778615