public abstract SQLite Database open Or Create Database
데이터베이스와 테이블 만들기 ■ 데이터베이스를 열거나 삭제할 수 있는 메소드 public abstract SQLite. Database open. Or. Create. Database (String name, int mode, SQLite. Database. Cursor. Factory factory) public abstract boolean delete. Database (String name) ■ SQL을 실행할 수 있는 메소드 - create, insert, delete 등 결과데이터가 없는 SQL문 public void exec. SQL(String sql) throws SQLException - select 와 같이 조회에 따른 결과 데이터가 있는 SQL문 public Cursor raw. Query(String sql) throws SQLException 1. 데이터베이스와 테이블 만들기 -8 -
메인 액티비티 코드 만들기 public class Main. Activity extends Activity { … SQLite. Database db; 1 SQLite. Database 객체 선언 public void on. Create(Bundle saved. Instance. State) { … create. Database. Btn. set. On. Click. Listener(new On. Click. Listener() { public void on. Click(View v) { database. Name = database. Name. Input. get. Text(). to. String(); create. Database(database. Name); } 2 버튼 클릭 시, 사용자가 입력한 문자열을 이용해 데이터베이스 생성 메소드 호출 }); table. Name = table. Name. Input. get. Text(). to. String(); create. Table(table. Name); 3 버튼 클릭 시, 사용자가 입력한 문자열을 이용해 테이블 생성 메소드 호출 } }); int count = insert. Record(); println(count + " records inserted. "); 1. 데이터베이스와 테이블 만들기 4 레코드 입력 메소드 호출 Continued. . - 11 -
메인 액티비티 코드 만들기 (계속) private void create. Database(String name) { println("creating database [" + name + "]. "); } db = open. Or. Create. Database(name, MODE_WORLD_WRITEABLE, null); database. Created = true; 5 데이터베이스 생성 또는 열기 private void create. Table(String name) { println("creating table [" + name + "]. "); db. exec. SQL("create table " + name + "(" + " _id integer PRIMARY KEY autoincrement, " + " name text, " + " age integer, " + " phone text); " ); } 6 테이블 생성을 위한 SQL문 실행 table. Created = true; 1. 데이터베이스와 테이블 만들기 - 12 - Continued. .
메인 액티비티 코드 만들기 (계속) private int insert. Record() { println("inserting records. "); int count = 3; db. exec. SQL( "insert into employee(name, age, phone) values ( 'John', 20, '010 -7788 -1234'); " ); db. exec. SQL( "insert into employee(name, age, phone) values ( 'Mike', 35, '010 -8888 -1111'); " ); db. exec. SQL( "insert into employee(name, age, phone) values ( 'Sean', 26, '010 -6677 -4321'); " ); } return count; private void println(String msg) { Log. d("Sample. Database", msg); status. append("n" + msg); } } 1. 데이터베이스와 테이블 만들기 - 13 - 7 레코드 입력을 위한 SQL문 실 행
테이블 생성과 레코드 추가를 위한 SQL 문법 ■ 테이블을 만들기 위한 SQL문 CREATE TABLE [IF NOT EXISTS] table_name(col_name column_definition, . . . ) [table_option]. . . ■ 레코드를 추가하기 위한 SQL문 INSERT INTO table_name<(column list)> VALUES (value, . . . ) 1. 데이터베이스와 테이블 만들기 - 15 -
헬퍼클래스를 이용해 업그레이드 지원하기 ■ SQLite. Open. Helper 클래스 • 데이터베이스를 만들거나 열기 위해 필요한 일들을 도와주는 역할을 함 ■ SQLite. Open. Helper 클래스 public SQLite. Open. Helper (Context context, String name, SQLite. Database. Cursor. Factory factory, int version) public abstract void on. Create (SQLite. Database db) public abstract void on. Open (SQLite. Database db) public abstract void on. Upgrade (SQLite. Database db, int old. Version, int new. Version) 2. 헬퍼클래스 사용하기 - 20 -
헬퍼 클래스 만들기 private class Database. Helper extends SQLite. Open. Helper { public Database. Helper(Context context) { } 1 SQLite. Open. Helper 클래스를 상속하여 새로운 헬퍼 클래스 정의 super(context, DATABASE_NAME, null, DATABASE_VERSION); 2 생성자에서 데이터베이스 이름과 버전을 이용해 상위 클래스의 생성자 호출 public void on. Create(SQLite. Database db) { println("creating table [" + TABLE_NAME + "]. "); try { String DROP_SQL = "drop table if exists " + TABLE_NAME; db. exec. SQL(DROP_SQL); } catch(Exception ex) { Log. e(TAG, "Exception in DROP_SQL", ex); } 3 데이터베이스 파일이 처음으로 만들어질 때 호출되는 메소드 정의 String CREATE_SQL = "create table " + TABLE_NAME + "(" + " _id integer PRIMARY KEY autoincrement, " + " name text, " + " age integer, " + " phone text)"; 2. 헬퍼클래스 사용하기 Continued. . - 22 -
헬퍼 클래스 만들기 (계속) try { db. exec. SQL(CREATE_SQL); } catch(Exception ex) { Log. e(TAG, "Exception in CREATE_SQL", ex); } println("inserting records. "); try { db. exec. SQL( "insert into " + TABLE_NAME + "(name, age, phone) values ('John', 20, '010 -7788 -1234'); " ); … } } catch(Exception ex) { Log. e(TAG, "Exception in insert SQL", ex); } public void on. Open(SQLite. Database db) { println("opened database [" + DATABASE_NAME + "]. "); } public void on. Upgrade(SQLite. Database db, int old. Version, int new. Version) { Log. w(TAG, "Upgrading database from version " + old. Version + " to " + new. Version + ". "); } } if (new. Version > 1) { db. exec. SQL("DROP TABLE IF EXISTS " + TABLE_NAME); } 2. 헬퍼클래스 사용하기 Continued. . - 23 -
메인 액티비티 만들기 public class Main. Activity extends Activity { … private static String DATABASE_NAME = null; private static String TABLE_NAME = "employee"; private static int DATABASE_VERSION = 1; private Database. Helper db. Helper; private SQLite. Database db; public void on. Create(Bundle saved. Instance. State) { … query. Btn. set. On. Click. Listener(new On. Click. Listener() { public void on. Click(View v) { DATABASE_NAME = input 01. get. Text(). to. String(); } }); boolean is. Open = open. Database(); if (is. Open) { execute. Raw. Query(); execute. Raw. Query. Param(); } 3. 데이터 조회하기 1 데이터베이스 열기를 위해 정의한 메소드 호출 Continued. . - 26 -
메인 액티비티 만들기 (계속) private boolean open. Database() { println("opening database [" + DATABASE_NAME + "]. "); db. Helper = new Database. Helper(this); db = db. Helper. get. Writable. Database(); } 2 Database. Helper 객체 생성 return true; private void execute. Raw. Query() { println("nexecute. Raw. Query called. n"); Cursor c 1 = db. raw. Query("select count(*) as Total from " + TABLE_NAME, null); println("cursor count : " + c 1. get. Count()); 3 raw. Query() 메소드를 이용해 SELECT SQL 문 실행 c 1. move. To. Next(); println("record count : " + c 1. get. Int(0)); } c 1. close(); 3. 데이터 조회하기 4 커서 객체를 이용해 레코드를 하나씩 처리 5 커서 닫기 Continued. . - 27 -
커서의 메소드 ▶ 데이터베이스 조회를 위해 SELECT문 실행 public abstract int get. Column. Count () public abstract int get. Column. Index (String column. Name) ▶ 결과값으로 Cursor 객체 리턴 public abstract String get. Column. Name (int column. Index) ▶ get. Count() 메소드로 레코드 개수 확인 public abstract String[] get. Column. Names () ▶ move. To. Next() 메소드로 하나씩 진행 ▶ get. XXX() 메소드로 값 확인 public abstract int get. Count () public abstract boolean move. To. Next () public abstract boolean move. To. Previous () public abstract boolean move. To. First () public abstract boolean move. To. Last () public abstract boolean move (int offset) public abstract String get. String (int column. Index) Cursor raw. Query(“select …”) public abstract short get. Short (int column. Index) public abstract int get. Int (int column. Index) public abstract long get. Long (int column. Index) public abstract float get. Float (int column. Index) public abstract double get. Double (int column. Index) 3. 데이터 조회하기 public abstract byte[] get. Blob (int column. Index) - 28 -
데이터 조회 – SELECT SQL SELECT [* | DISTINCT] column_name [, columnname 2] FROM tablename 1 [, tablename 2] WHERE [condition and|or condition. . . ] [GROUP BY column-list] [HAVING conditions] [ORDER BY "column-list" [ASC | DESC] ] 3. 데이터 조회하기 - 29 -
커서어댑터 사용하기 – 메인 액티비티 만들기 public class Main. Activity extends Activity { … public void on. Create(Bundle saved. Instance. State) { … boolean is. Open = open. Database(); if (is. Open) { 1 데이터베이스 열기 2 데이터베이스를 쿼리하여 결과값으로 커서 객체 참조 Cursor cursor = execute. Raw. Query. Param(); 3 start. Managing. Cursor() 메소드 호출 start. Managing. Cursor(cursor); String[] columns = new String[] {“name“, “age“, “phone“}; int[] to = new int[] { R. id. name_entry, R. id. age_entry, R. id. phone_entry }; Simple. Cursor. Adapter m. Adapter = new Simple. Cursor. Adapter(this, R. layout. listitem, cursor, columns, to); list. set. Adapter(m. Adapter); } }. . . } 4. 커서어댑터로 뷰에 보여주기 - 34 - 4 어댑터 객체 생성과 설정
메인 액티비티 만들기 public class Main. Activity extends Activity { … String drug. Database. File = "/sdcard/druginfo. db"; String master. Source. File = "/sdcard/master. dat"; String details. Source. File = "/sdcard/details. dat"; 1 사용할 파일명을 변수로 선언 SQLite. Database db; public void on. Create(Bundle saved. Instance. State) { … btn. Write. DB. set. On. Click. Listener(new On. Click. Listener() { public void on. Click(View v) { open. Database(drug. Database. File); 2 버튼 클릭시 데이터베이스를 열고 작업 수행 후 닫기 create. Table. From. Source("MASTER"); create. Table. From. Source("DETAILS"); close. Database(); } }); } 5. 약품정보 데이터베이스 구성하기 - 39 - Continued. .
메인 액티비티 만들기 (계속) public void create. Table. From. Source(String source. Type) { if (source. Type. equals("MASTER")) { try { 3 파일에서 읽어들이기 위해 Reader 객체 생성 File my. File = new File(master. Source. File); File. Input. Stream f. In = new File. Input. Stream(my. File); Buffered. Reader my. Reader = new Buffered. Reader(new Input. Stream. Reader(f. In, "euc-kr")); String a. Line = ""; String a. Buffer = ""; println("creating master table [MASTER]. "); create. Master. Table(); 4 새로운 테이블 만들기 int count = 0; int record. Count = 0; while ((a. Line = my. Reader. read. Line()) != null) { println("processing line #" + count); boolean is. Inserted = insert. Master. Data(a. Line); if (is. Inserted) { record. Count++; } 5 읽어들인 데이터를 이용해 레코드 추가하기 count++; } 5. 약품정보 데이터베이스 구성하기 - 40 - Continued. .
메인 액티비티 만들기 (계속) } 6 몇 개의 레코드 쿼리해서 확인하기 query. Master. Table(); } catch (Exception ex) { ex. print. Stack. Trace(); println("Exception : " + ex. to. String()); } } else if(source. Type. equals("DETAILS")) {. . . } public void println(String msg) { Log. d(TAG, msg); txt. View. append("n" + msg); } public void open. Database(String database. File) { println("creating or opening database [" + drug. Database. File + "]. "); db = SQLite. Database. open. Database(database. File, null, SQLite. Database. OPEN_READWRITE+SQLite. Database. CREATE_IF_NECESSARY); }. . . 5. 약품정보 데이터베이스 구성하기 - 41 - Continued. .
메인 액티비티 만들기 (계속) public void create. Master. Table() { db. exec. SQL("drop table if exists MASTER"); db. exec. SQL("create table MASTER(" + " DRUGCODE text, " + " DRUGNAME text, " + " PRODENNM text, " + " PRODKRNM text, " + " PHRMNAME text, " + " DISTRNAME text, " + " REPDGID text, " + " REPDGNAME text)" ); } public void query. Master. Table() { String a. SQL = "select DRUGCODE, DRUGNAME, PRODKRNM " + " from MASTER" + " where DRUGNAME like ? "; String[] args = {"Aspirin%"}; Cursor out. Cursor = db. raw. Query(a. SQL, args); int record. Count = out. Cursor. get. Count(); println("cursor count : " + record. Count + "n"); for (int i = 0; i < record. Count; i++) { out. Cursor. move. To. Next(); String product. Name = out. Cursor. get. String(2); println("#" + i + " 제품명 : " + product. Name); } } } out. Cursor. close(); 5. 약품정보 데이터베이스 구성하기 - 42 -
메인 액티비티 만들기 public class Main. Activity extends Activity { … public void on. Create(Bundle saved. Instance. State) { … adapter = new Icon. Text. List. Adapter(this); list. View = new Data. List. View(this); btn. Search. set. On. Click. Listener( new On. Click. Listener () { public void on. Click(View v) { str. Search = edit. Search. get. Text(). to. String(); str. Search. Query = str. Search. concat("%"); Database. Helper. open. Database(Database. Helper. drug. Database. File); 3 데이터베이스 열기 Cursor cursor = Database. Helper. query. Master. Table(str. Search. Query); 4 쿼리하여 커서 객체 참조 Add. Cursor. Data(cursor); 5 커서의 데이터를 어댑터에 추가 list. View. set. Adapter(adapter); } }); 6 리스트뷰에 어댑터 설정 imm. hide. Soft. Input. From. Window(edit. Search. get. Window. Token(), 0); 5. 약품정보 데이터베이스 구성하기 - 46 - Continued. .
메인 액티비티 만들기 (계속) list. View. set. On. Data. Selection. Listener( new On. Data. Selection. Listener () { public void on. Data. Selected(Adapter. Viewparent, Viewv, int position, long id) { Icon. Text. Item select. Item = (Icon. Text. Item)adapter. get. Item(position); Bundle bundle = new Bundle(); bundle. put. String("data 0", select. Item. get. Data(0)); bundle. put. String("data 1", select. Item. get. Data(1)); bundle. put. String("data 2", select. Item. get. Data(2)); bundle. put. String("data 3", select. Item. get. Data(3)); } } }); Intent intent = new Intent( get. Application. Context(), Drug. Detail. Activity. class ); intent. put. Extras(bundle); 7 리스트뷰의 한 아이템 선택했을 때 상세 화면으로 이동 start. Activity ( intent ); protected void on. Destroy() { super. on. Destroy(); } Database. Helper. close. Database(); 5. 약품정보 데이터베이스 구성하기 - 47 - Continued. .
메인 액티비티 만들기 (계속) public void Add. Cursor. Data ( Cursor out. Cursor ) { int record. Count = out. Cursor. get. Count(); println("cursor count : " + record. Count + "n"); adapter. clear(); int int drug. Code. Col = out. Cursor. get. Column. Index("DRUGCODE"); drug. Name. Col = out. Cursor. get. Column. Index("DRUGNAME"); prod. KName. Col = out. Cursor. get. Column. Index("PRODKRNM"); distr. Name. Col = out. Cursor. get. Column. Index("DISTRNAME"); Resources res = get. Resources(); for (int i = 0; i < record. Count; i++) { out. Cursor. move. To. Next(); String drug. Code = out. Cursor. get. String(drug. Code. Col); String drug. Name = out. Cursor. get. String(drug. Name. Col); String prod. KName = out. Cursor. get. String(prod. KName. Col); String distr. Name = out. Cursor. get. String(distr. Name. Col); } } } adapter. add. Item(new Icon. Text. Item(res. get. Drawable(R. drawable. capsule 1), prod. KName, drug. Code , drug. Name, distr. Name)); out. Cursor. close(); 8 커서의 데이터를 이용해 아이템을 만든 후 어댑터에 추가 public void println(String msg) { Log. d(TAG, msg); } 5. 약품정보 데이터베이스 구성하기 - 48 -
참고 문헌 [ References] • 기본 서적 2013, 정재곤, “Do it! 안드로이드 앱 프로그래밍(개정판)”, 이지스퍼블리싱(주) • Android Website http: //www. android. com/ • Google Developer’s Conference http: //code. google. com/events/io/ • Android SDK Documentation References - 50 -
- Slides: 50