안드로이드에서 SQLite 데이터베이스를 사용하는 예
안드로이드에 내장된 SQLite 데이터베이스를 사용하는 예제를 작성하고 Android Studio에서 제공하는 DDMS툴을 통해 생성된 데이터베이스를 AVD로부터 가져와서 SQLite Database Browser 프로그램을 통해 확인하고 편집한 후에 다시 AVD에 넣는 작업을 알아보려고 한다
테스트 환경 준비
SQLite 3 데이터베이스의 자료형
NULL
INTEGER : 8바이트 정수
REAL : 8바이트 실수
TEXT
BLOB
SQLiteOpenHelper 클래스를 사용하는 액티비티 클래스
package com.example.duniv007.helloapp; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class SQLite3Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sqlite3); EmpDAO dao = new EmpDAO(getApplicationContext(), 1); EmpVO emp = new EmpVO(0,"SMITH",10, "2000-10-07"); dao.insert(emp); } } class DBHelper extends SQLiteOpenHelper { Context context; static final String dbName = "Sample.db"; static final String tableName = "emp"; public DBHelper(Context context, int version) { super(context, dbName, null, version); this.context = context; } /** 생성자의 2번째 파라미터로 전달된 이름의 DB가 존재하지 않는 경우에 안드로이드 시스템은 * 해당 이름의 DB를 생성하고 이어서 onCreate() 를 호출한다 * 이때 onCreate(SQLiteDatabase db) 메소드의 파라미터로 생성된 DB의 인스턴스 참조가 전달된다 * 이 메소드는 주로 DB 생성 후 테이블이 없는 상태이므로 앞으로 사용할 테이블을 생성하는 역할을 한다 */ @Override public void onCreate(SQLiteDatabase db) { // String dropSql = "DROP TABLE IF EXISTS emp"; // db.execSQL(dropSql); String createSql = "CREATE TABLE emp (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, ename TEXT, " + "deptno INTEGER, hiredate TEXT)"; db.execSQL(createSql); Toast.makeText(context, "DB is created", Toast.LENGTH_LONG).show(); } /**SQLiteOpenHelper 클래스의 생성자의 마지막 파라미터에 전달되는 버전정보가 이전 버전보다 높으면 * 이 메소드가 자동으로 호출된다 * 이 메소드는 일반적으로 기존 테이블을 삭제하고 새 버전에 맞춰서 테이블을 새로 생성하는 목적으로 사용된다 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) { Log.d("onUpgrade(), DB Version", "OLD:"+oldVer+", NEW:"+newVer); // String dropSql = "DROP TABLE IF EXISTS emp"; // db.execSQL(dropSql); // onCreate(db); } } class EmpDAO { public static final String tableName = "emp"; DBHelper dbHelper; SQLiteDatabase db; EmpDAO(Context context, int ver) { this.dbHelper = new DBHelper(context, ver); db = dbHelper.getWritableDatabase(); } // 데이터 추가 public void insert(EmpVO emp) { String sql = "INSERT INTO " + tableName + " VALUES ( NULL, '" + emp.ename+ "', "+ emp.deptno +",'"+emp.hiredate+"');"; db.execSQL(sql); Log.d("INSERT", "사원정보 추가 성공"); } // 리스트 가져오기 public List<EmpVO> list() { String sql = "SELECT * FROM " + tableName + ";"; Cursor rs = db.rawQuery(sql, null); rs.moveToFirst(); List<EmpVO> list = new ArrayList<EmpVO>(); while (!rs.isAfterLast()) { EmpVO emp = new EmpVO(rs.getInt(0), rs.getString(1), rs.getInt(2), rs.getString(3)); list.add(emp); rs.moveToNext(); } rs.close(); return list; } // 한개의 레코드 가져오기 public EmpVO getEmpById(int id) { //String sql = "SELECT * FROM " + tableName + " WHERE id = " + id + ";"; //Cursor rs = db.rawQuery(sql, null); // 위의 방법대신 아래처럼 ? 표를 사용하여 파라미터를 표현할 수도 있다 String sql = "SELECT * FROM " + tableName + " WHERE id = ?;"; Cursor rs = db.rawQuery(sql, new String[]{""+id }); // 파라미터에 전달할 값을 문자열 배열로 전달한다 if (rs.moveToFirst()) { EmpVO emp = new EmpVO(rs.getInt(0), rs.getString(1), rs.getInt(2), rs.getString(3)); rs.close(); return emp; } rs.close(); return null; } // 레코드 변경 public void update(EmpVO emp) { String sql = "UPDATE " + tableName + " SET deptno = " + emp.deptno + " WHERE id="+emp.empno+";"; db.execSQL(sql); Log.i("UPDATE", "사원정보 업데이트 성공"); } // 레코드 삭제 public void delete(int id) { String sql = "DELETE FROM " + tableName + " WHERE id = " + id + ";"; db.execSQL(sql); Log.i("DELETE", "사원정보 삭제 성공"); } } class EmpVO { int empno; String ename; int deptno; String hiredate; public EmpVO(int empno, String ename, int deptno, String hiredate){ this.empno = empno; this.ename = ename; this.deptno = deptno; this.hiredate = hiredate; } }
수정/삭제/리스트 등의 기능은 다음과 같은 방법을 사용하여 테스트할 수 있다
EmpDAO dao = new EmpDAO(getApplicationContext(), 1); // 레코드 추가 EmpVO emp = new EmpVO(0,"SMITH",10, "2000-10-07"); dao.insert(emp); // 리스트 보기 List<EmpVO> list = dao.list(); for(int i=0;i<list.size();i++) { Log.i("사번",list.get(i).empno+""); Log.i("이름",list.get(i).ename+""); Log.i("부서",list.get(i).deptno+""); Log.i("입사",list.get(i).hiredate+""); } // 특정 사원정보 가져오기 EmpVO emp = dao.getEmpById(1); Log.i("사번",emp.empno+""); Log.i("이름",emp.ename+""); Log.i("부서",emp.deptno+""); Log.i("입사",emp.hiredate+""); // 사원정보 수정 dao.update(new EmpVO(1,"SMITH",15, "2000-10-07")); // 사원정보 삭제 dao.delete(1);
위의 코드를 실행하면 DB 파일이 생성되고 그 안에 테이블도 생성된다. 생성된 DB 파일을 열고 그 안에 저장된 테이블 데이터를 확인하고 편집할 수도 있는데, Android Studio 의 Tools > Android > Android Device Monitor 를 선택하면 된다
DB 파일 경로 찾기
왼쪽 섹션에서 현재 실행된 에뮬레이터를 선택하고 우측에서 File Explorer를 선택하면 안드로이드 파일 시스템을 보여주는 탐색기가 실행된다
현재 프로젝트가 저장된 경로는 [ data/data/액티비티의 패키지 ] 이므로 찾아서 선택한다
DB 파일 추출
Android Studio 에서 제공하는 DDMS 툴을 이용하여 위의 프로젝트에서 생성된 Sample.db 데이터베이스를 AVD로부터 밖으로 가져온다
DB 내용 편집
SQLite Database Broswer 를 실행하고 아래처럼 테이블의 내용을 추가하거나 편집하고 다시 저장한다
편집된 DB 파일을 디바이스로 복사하기
Android Studio 의 DDMS 툴을 이용하여 다시 AVD의 해당 프로젝트에 데이터베이스 파일을 넣는다