데이터베이스 PART 02 - Chapter 08 Do It! 안드로이드 앱 프로그래밍 Jun. 2013 ○ 본 강의 자료는 이지스퍼블리싱(주)에서 제공하는 강의 교안입니다. ○ 본 강의 교안은 아래 출판 서적의 내용을 기준으로 구성되었습니다. 또한 다수의 기타 서적이나 사이트를 참조하였습니다. 레퍼런스를 참조하십시오. 2013, 정재곤, “Do it! 안드로이드 앱 프로그래밍(개정판)”, 이지스퍼블리싱(주) - 강의 교안에 사용된 화면 캡쳐나 실습 자료의 경우에는 문서 업데이트에 따라 변경될 수 있습니다. 이지스퍼블리싱(주) 제공 강의 교안 저자 : 정재곤
앱의 데이터를 잘 관리하려면 어떻게 해야 할까요? 이번 장에서는 무엇을 다룰까요? 앱의 데이터를 잘 관리하려면 어떻게 해야 할까요? 스마트폰의 데이터베이스에 대해 알아볼까요? 데이터베이스와 테이블을 만드는 방법을 알아볼까요? 헬퍼 클래스를 이용해 업그레이드를 지원하는 방법을 알아볼까요? 데이터베이스에서 데이터를 조회하는 방법을 알아볼까요? 커서 어댑터를 이용해 데이터를 보여주는 방법을 알아볼까요? 약품정보 데이터베이스를 만들어 볼까요?
이번 장에서는 무엇을 다룰까요?
데이터베이스에 대한 이해와 데이터 저장 및 조회 실습 강의 주제 및 목차 강의 주제 데이터베이스에 대한 이해와 데이터 저장 및 조회 실습 1 데이터베이스와 테이블 만들기 목 차 2 헬퍼클래스 사용하기 3 데이터 조회하기 4 커서어댑터로 뷰에 보여주기 5 약품정보 데이터베이스 구성하기
PART2 – CH8. 데이터베이스 1. 데이터베이스와 테이블 만들기
모바일 데이터베이스란? ■ 안드로이드에서 데이터를 저장하는 대표적인 방법 ■ 데이터베이스 • 설정 정보 • 파일 사용 • 데이터베이스 많은 데이터를 체계적으로 관리 데이터베이스 만들기 테이블 만들기 ■ 데이터베이스 • 여러 개의 테이블을 담고 있는 하나의 그릇 역할 ■ 데이터베이스를 만드는 가장 간단한 방법 • Context 클래스에 정의된 openOrCreateDatabase() 메소드를 사용 • 애플리케이션에서 기본적으로 사용하는 Activity 클래스가 Context를 상속한 것이므로 액티비티 안에서 데이터베이스 생성 가능 레코드 추가하기 데이터 조회하기 [데이터베이스 활용 순서] 1. 데이터베이스와 테이블 만들기
데이터베이스와 테이블 만들기 ■ 데이터베이스를 열거나 삭제할 수 있는 메소드 public abstract SQLiteDatabase openOrCreateDatabase (String name, int mode, SQLiteDatabase.CursorFactory factory) public abstract boolean deleteDatabase (String name) ■ SQL을 실행할 수 있는 메소드 - create, insert, delete 등 결과데이터가 없는 SQL문 public void execSQL(String sql) throws SQLException - select 와 같이 조회에 따른 결과 데이터가 있는 SQL문 public Cursor rawQuery(String sql) throws SQLException 1. 데이터베이스와 테이블 만들기
create table customer … 데이터베이스 만들기 구조 ▶ 1단계 : 데이터베이스 생성 2단계 : 테이블 생성 3단계 : 레코드 추가 ▶ 테이블 생성과 레코드 추가는 SQL문을 만들어 실행 (create table … & insert into …) Database : customer.db create table customer … insert into customer … John 20 010-7788-1234 insert into customer … Mike 35 010-7777-2233 1. 데이터베이스와 테이블 만들기
데이터베이스 만들기 예제 데이터베이스 만들기 예제 메인 액티비티의 메인 액티비티 코드 작성 XML 레이아웃 정의 데이터베이스와 테이블 만드는 방법 메인 액티비티의 XML 레이아웃 정의 메인 액티비티 코드 작성 메인 액티비티 레이아웃 정의 데이터베이스와 테이블 만들기 1. 데이터베이스와 테이블 만들기
메인 액티비티 코드 만들기 public class MainActivity extends Activity { … SQLiteDatabase db; public void onCreate(Bundle savedInstanceState) { createDatabaseBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { databaseName = databaseNameInput.getText().toString(); createDatabase(databaseName); } }); tableName = tableNameInput.getText().toString(); createTable(tableName); int count = insertRecord(); println(count + " records inserted."); SQLiteDatabase 객체 선언 1 버튼 클릭 시, 사용자가 입력한 문자열을 이용해 데이터베이스 생성 메소드 호출 2 버튼 클릭 시, 사용자가 입력한 문자열을 이용해 테이블 생성 메소드 호출 3 레코드 입력 메소드 호출 4 Continued.. 1. 데이터베이스와 테이블 만들기
메인 액티비티 코드 만들기 (계속) private void createDatabase(String name) { println("creating database [" + name + "]."); db = openOrCreateDatabase(name, MODE_WORLD_WRITEABLE, null); databaseCreated = true; } private void createTable(String name) { println("creating table [" + name + "]."); db.execSQL("create table " + name + "(" + " _id integer PRIMARY KEY autoincrement, " + " name text, " + " age integer, " + " phone text);" ); tableCreated = true; 데이터베이스 생성 또는 열기 5 테이블 생성을 위한 SQL문 실행 6 1. 데이터베이스와 테이블 만들기 Continued..
메인 액티비티 코드 만들기 (계속) private int insertRecord() { println("inserting records."); int count = 3; db.execSQL( "insert into employee(name, age, phone) values ( 'John', 20, '010-7788-1234');" ); 'Mike', 35, '010-8888-1111');" ); 'Sean', 26, '010-6677-4321');" ); return count; } private void println(String msg) { Log.d("SampleDatabase", msg); status.append("\n" + msg); 레코드 입력을 위한 SQL문 실행 7 1. 데이터베이스와 테이블 만들기
칼럼 참조용 데이터 타입 칼럼 타입 설 명 text, varchar 문자열 smallint, integer 정수 (2바이트 또는 4바이트) real, float, double 부동소수 (4바이트 또는 8바이트) boolean true 또는 false date, time, timestamp 시간 (날짜, 시간, 날짜+시간) blob, binary 바이너리 [표] SQLite에서 지원하는 칼럼 타입 1. 데이터베이스와 테이블 만들기
테이블 생성과 레코드 추가를 위한 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. 데이터베이스와 테이블 만들기
데이터베이스 생성, 테이블 생성 그리고 레코드 추가 실행 화면 데이터베이스 생성, 테이블 생성 그리고 레코드 추가 1. 데이터베이스와 테이블 만들기
SQLite Administrator로 데이터베이스 만들기 데이터베이스 관리도구 http://sqliteadmin.orbmu2k.de/ 참조 SQLite Administrator로 데이터베이스 만들기 테이블 만들기 메뉴 칼럼 정의하기 1. 데이터베이스와 테이블 만들기
데이터베이스 저장 위치 ▶ 데이터베이스는 하나의 파일로 저장됨 ▶ 내장 메모리에 저장되는 데이터베이스 파일은 /data/data/<package_name>/databases 폴더에 저장되며 SD 카드와 같은 외장 메모리에 저장할 수도 있음 데이터베이스 파일의 저장 위치 1. 데이터베이스와 테이블 만들기
PART2 – CH8. 데이터베이스 2. 헬퍼클래스 사용하기
헬퍼클래스를 이용해 업그레이드 지원하기 ■ SQLiteOpenHelper 클래스 ■ SQLiteOpenHelper 클래스 • 데이터베이스를 만들거나 열기 위해 필요한 일들을 도와주는 역할을 함 ■ SQLiteOpenHelper 클래스 public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version) public abstract void onCreate (SQLiteDatabase db) public abstract void onOpen (SQLiteDatabase db) public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) 2. 헬퍼클래스 사용하기
DatabaseHelper extends SQLiteOpenHelper 헬퍼클래스의 구조 ▶ 새로 만드는 CustomerDatabase 클래스는 DatabaseHelper 객체와 버전 정보 관리 ▶ Helper 클래스를 상속한 DatabaseHelper 클래스 안에서는 처음 데이터베이스가 만들어질 때는 onCreate(), 버전이 바뀌어 업그레이드될 때는 onUpgrade() 메소드가 호출됨 CustomerDatabase DatabaseHelper extends SQLiteOpenHelper onCreate( ) onOpen( ) onUpgrade( ) 2. 헬퍼클래스 사용하기
헬퍼 클래스 만들기 private class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public void onCreate(SQLiteDatabase db) { println("creating table [" + TABLE_NAME + "]."); try { String DROP_SQL = "drop table if exists " + TABLE_NAME; db.execSQL(DROP_SQL); } catch(Exception ex) { Log.e(TAG, "Exception in DROP_SQL", ex); String CREATE_SQL = "create table " + TABLE_NAME + "(" + " _id integer PRIMARY KEY autoincrement, " + " name text, " + " age integer, " + " phone text)"; SQLiteOpenHelper 클래스를 상속하여 새로운 헬퍼 클래스 정의 1 생성자에서 데이터베이스 이름과 버전을 이용해 상위 클래스의 생성자 호출 2 데이터베이스 파일이 처음으로 만들어질 때 호출되는 메소드 정의 3 Continued.. 2. 헬퍼클래스 사용하기
헬퍼 클래스 만들기 (계속) Continued.. 2. 헬퍼클래스 사용하기 try { db.execSQL(CREATE_SQL); } catch(Exception ex) { Log.e(TAG, "Exception in CREATE_SQL", ex); } println("inserting records."); db.execSQL( "insert into " + TABLE_NAME + "(name, age, phone) values ('John', 20, '010-7788-1234');" ); … Log.e(TAG, "Exception in insert SQL", ex); public void onOpen(SQLiteDatabase db) { println("opened database [" + DATABASE_NAME + "]."); public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + "."); if (newVersion > 1) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); Continued.. 2. 헬퍼클래스 사용하기
PART2 – CH8. 데이터베이스 3. 데이터 조회하기
데이터 조회하기 데이터 조회하기 예제 메인 액티비티의 메인 액티비티 코드 작성 XML 레이아웃 정의 데이터베이스에서 SQL로 데이터 조회하기 메인 액티비티의 XML 레이아웃 정의 메인 액티비티 코드 작성 메인 액티비티 레이아웃 정의 커서를 이용해 데이터 조회하기 3. 데이터 조회하기
메인 액티비티 만들기 public class MainActivity extends Activity { … private static String DATABASE_NAME = null; private static String TABLE_NAME = "employee"; private static int DATABASE_VERSION = 1; private DatabaseHelper dbHelper; private SQLiteDatabase db; public void onCreate(Bundle savedInstanceState) { queryBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { DATABASE_NAME = input01.getText().toString(); boolean isOpen = openDatabase(); if (isOpen) { executeRawQuery(); executeRawQueryParam(); } }); 데이터베이스 열기를 위해 정의한 메소드 호출 1 Continued.. 3. 데이터 조회하기
메인 액티비티 만들기 (계속) private boolean openDatabase() { println("opening database [" + DATABASE_NAME + "]."); dbHelper = new DatabaseHelper(this); db = dbHelper.getWritableDatabase(); return true; } private void executeRawQuery() { println("\nexecuteRawQuery called.\n"); Cursor c1 = db.rawQuery("select count(*) as Total from " + TABLE_NAME, null); println("cursor count : " + c1.getCount()); c1.moveToNext(); println("record count : " + c1.getInt(0)); c1.close(); DatabaseHelper 객체 생성 2 rawQuery() 메소드를 이용해 SELECT SQL 문 실행 3 커서 객체를 이용해 레코드를 하나씩 처리 4 커서 닫기 5 Continued.. 3. 데이터 조회하기
커서의 메소드 public abstract int getCount () public abstract int getColumnCount () public abstract int getColumnIndex (String columnName) public abstract String getColumnName (int columnIndex) public abstract String[] getColumnNames () public abstract int getCount () public abstract boolean moveToNext () public abstract boolean moveToPrevious () public abstract boolean moveToFirst () public abstract boolean moveToLast () public abstract boolean move (int offset) ▶ 데이터베이스 조회를 위해 SELECT문 실행 ▶ 결과값으로 Cursor 객체 리턴 ▶ getCount() 메소드로 레코드 개수 확인 ▶ moveToNext() 메소드로 하나씩 진행 ▶ getXXX() 메소드로 값 확인 public abstract String getString (int columnIndex) public abstract short getShort (int columnIndex) public abstract int getInt (int columnIndex) public abstract long getLong (int columnIndex) public abstract float getFloat (int columnIndex) public abstract double getDouble (int columnIndex) public abstract byte[] getBlob (int columnIndex) Cursor rawQuery(“select …”) 3. 데이터 조회하기
데이터 조회 – SELECT SQL SELECT [* | DISTINCT] column_name [,columnname2] FROM tablename1 [,tablename2] WHERE [condition and|or condition...] [GROUP BY column-list] [HAVING conditions] [ORDER BY "column-list" [ASC | DESC] ] 3. 데이터 조회하기
실행 화면 SQL을 이용한 테이블 레코드 조회 3. 데이터 조회하기
PART2 – CH8. 데이터베이스 4. 커서어댑터로 뷰에 보여주기
커서어댑터로 뷰에 보여주기 ■ 커서어댑터(CursorAdapter) • 결과물을 한꺼번에 다 읽어 들여 화면에 보여줄 필요 없이 커서 객체와 UI 객체를 함께 바인딩하여 화면에 보여주는 과정을 어댑터에서 알아서 처리함 ■ SimpleCursorAdapter • 바로 사용할 수 있도록 API에 정의되어 있는 커서 어댑터 클래스 4. 커서어댑터로 뷰에 보여주기
커서어댑터 만들기 ■ 생성자 [API] public SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to) ▶ SimpleCursorAdapter를 이용해 리스트뷰에 데이터베이스 커서의 데이터를 보여주는 경우 ▶ 첫번째 파라미터 : 리스트뷰와 관련된 컨텍스트 객체 ▶ 두번째 파라미터 : 리스트뷰의 아이템을 위해 정의한 XML 레이아웃 파일의 리소스 ID ▶ 세번째 파라미터 : 쿼리를 통해 리턴받은 커서 객체 ▶ 네번째 파라미터 : 커서 객체에 들어 있는 칼럼 중에서 리스트뷰에 보여줄 칼럼의 이름 배열 ▶ 다섯번째 파라미터 : 두번째 파라미터의 XML 레이아웃에 정의된 UI 객체의 리소스 ID 배열 4. 커서어댑터로 뷰에 보여주기
커서어댑터 사용하기 – 메인 액티비티 만들기 public class MainActivity extends Activity { … public void onCreate(Bundle savedInstanceState) { boolean isOpen = openDatabase(); if (isOpen) { Cursor cursor = executeRawQueryParam(); startManagingCursor(cursor); String[] columns = new String[] {“name“, “age“, “phone“}; int[] to = new int[] { R.id.name_entry, R.id.age_entry, R.id.phone_entry }; SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.listitem, cursor, columns, to); list.setAdapter(mAdapter); } ... 데이터베이스 열기 1 데이터베이스를 쿼리하여 결과값으로 커서 객체 참조 2 startManagingCursor() 메소드 호출 3 어댑터 객체 생성과 설정 4 4. 커서어댑터로 뷰에 보여주기
커서어댑터를 이용해 리스트뷰에 결과물을 보여주는 화면 실행 화면 ■ startManagingCursor() 메소드 [API] public void startManagingCursor (Cursor c) 커서어댑터를 이용해 리스트뷰에 결과물을 보여주는 화면 4. 커서어댑터로 뷰에 보여주기
PART2 – CH8. 데이터베이스 5. 약품정보 데이터베이스 구성하기
원시 파일을 데이터베이스 테이블로 바꾸는 과정 약품정보 데이터베이스 구성하기 ■ 약품정보 • 대용량 데이터를 사용하는 애플리케이션 중 건강 분야에서 가장 흔히 제공되는 정보 ■ 원시 데이터의 가공 • 흔히 데이터베이스에 저장되는 데이터는 텍스트 파일 등으로 존재하는 경우가 많아 코드를 만들어 가공하는 과정을 거침 원시 파일 데이터베이스 테이블 master.dat MASTER DETAILS details.dat druginfo.db 원시 파일을 데이터베이스 테이블로 바꾸는 과정 5. 약품정보 데이터베이스 구성하기
데이터 포맷 [Format] master.dat의 내용 ... details.dat의 내용 ASP5|Aspirin 500mg|Aspirin 500mg|바이엘 아스피린 정 500mg|바이엘 |바이엘코리아|ASP000000|Aspirin| details.dat의 내용 ASP5|51|효능|혈소판 응집 억제(ASPC, ASPP)| ASP5|52|용법|1회 0.5∼1.5 g, 1일 2∼3회 (ASPC, ASPP: 1일 1회 30∼300 mg)| ASP5|54|이상반응|발진, 부종, 담마진, 결막염 등의 과민반응, 소화관 출혈, 식욕부진| ASP5|56|금기|혈우병, 소화성 궤양 환자| 5. 약품정보 데이터베이스 구성하기
메인 액티비티 만들기 public class MainActivity extends Activity { … String drugDatabaseFile = "/sdcard/druginfo.db"; String masterSourceFile = "/sdcard/master.dat"; String detailsSourceFile = "/sdcard/details.dat"; SQLiteDatabase db; public void onCreate(Bundle savedInstanceState) { btnWriteDB.setOnClickListener(new OnClickListener() { public void onClick(View v) { openDatabase(drugDatabaseFile); createTableFromSource("MASTER"); createTableFromSource("DETAILS"); closeDatabase(); } }); 사용할 파일명을 변수로 선언 1 버튼 클릭시 데이터베이스를 열고 작업 수행 후 닫기 2 5. 약품정보 데이터베이스 구성하기 Continued..
메인 액티비티 만들기 (계속) public void createTableFromSource(String sourceType) { if (sourceType.equals("MASTER")) { try { File myFile = new File(masterSourceFile); FileInputStream fIn = new FileInputStream(myFile); BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn, "euc-kr")); String aLine = ""; String aBuffer = ""; println("creating master table [MASTER]."); createMasterTable(); int count = 0; int recordCount = 0; while ((aLine = myReader.readLine()) != null) { println("processing line #" + count); boolean isInserted = insertMasterData(aLine); if (isInserted) { recordCount++; } count++; 파일에서 읽어들이기 위해 Reader 객체 생성 3 새로운 테이블 만들기 4 읽어들인 데이터를 이용해 레코드 추가하기 5 5. 약품정보 데이터베이스 구성하기 Continued..
메인 액티비티 만들기 (계속) queryMasterTable(); } catch (Exception ex) { ex.printStackTrace(); println("Exception : " + ex.toString()); } } else if(sourceType.equals("DETAILS")) { ... public void println(String msg) { Log.d(TAG, msg); txtView.append("\n" + msg); public void openDatabase(String databaseFile) { println("creating or opening database [" + drugDatabaseFile + "]."); db = SQLiteDatabase.openDatabase(databaseFile, null, SQLiteDatabase.OPEN_READWRITE+SQLiteDatabase.CREATE_IF_NECESSARY); 몇 개의 레코드 쿼리해서 확인하기 6 5. 약품정보 데이터베이스 구성하기 Continued..
메인 액티비티 만들기 (계속) 5. 약품정보 데이터베이스 구성하기 public void createMasterTable() { db.execSQL("drop table if exists MASTER"); db.execSQL("create table MASTER(" + " DRUGCODE text, " + " DRUGNAME text, " + " PRODENNM text, " + " PRODKRNM text, " + " PHRMNAME text, " + " DISTRNAME text, " + " REPDGID text, " + " REPDGNAME text)" ); } public void queryMasterTable() { String aSQL = "select DRUGCODE, DRUGNAME, PRODKRNM " + " from MASTER" + " where DRUGNAME like ?"; String[] args = {"Aspirin%"}; Cursor outCursor = db.rawQuery(aSQL, args); int recordCount = outCursor.getCount(); println("cursor count : " + recordCount + "\n"); for (int i = 0; i < recordCount; i++) { outCursor.moveToNext(); String productName = outCursor.getString(2); println("#" + i + " 제품명 : " + productName); outCursor.close(); 5. 약품정보 데이터베이스 구성하기
원시 파일을 SD 카드로 복사 ▶ 원시 파일을 SD카드로 복사하고 앱을 실행하면 데이터베이스 파일이 생성됨 5. 약품정보 데이터베이스 구성하기
매니페스트에 권한 등록하기 ■ 매니페스트 파일에 SD카드 접근 권한 등록 ... <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 데이터베이스 생성 화면 5. 약품정보 데이터베이스 구성하기
약품정보 검색하기 약품 정보 검색 애플리케이션의 화면 5. 약품정보 데이터베이스 구성하기
메인 액티비티 만들기 public class MainActivity extends Activity { … public void onCreate(Bundle savedInstanceState) { adapter = new IconTextListAdapter(this); listView = new DataListView(this); btnSearch.setOnClickListener( new OnClickListener () { public void onClick(View v) { strSearch = editSearch.getText().toString(); strSearchQuery = strSearch.concat("%"); DatabaseHelper.openDatabase(DatabaseHelper.drugDatabaseFile); Cursor cursor = DatabaseHelper.queryMasterTable(strSearchQuery); AddCursorData(cursor); listView.setAdapter(adapter); imm.hideSoftInputFromWindow(editSearch.getWindowToken(), 0); } }); 데이터베이스 열기 3 쿼리하여 커서 객체 참조 4 커서의 데이터를 어댑터에 추가 5 리스트뷰에 어댑터 설정 6 5. 약품정보 데이터베이스 구성하기 Continued..
메인 액티비티 만들기 (계속) listView.setOnDataSelectionListener( new OnDataSelectionListener () { public void onDataSelected(AdapterViewparent,Viewv,int position, long id) { IconTextItem selectItem = (IconTextItem)adapter.getItem(position); Bundle bundle = new Bundle(); bundle.putString("data0", selectItem.getData(0)); bundle.putString("data1", selectItem.getData(1)); bundle.putString("data2", selectItem.getData(2)); bundle.putString("data3", selectItem.getData(3)); Intent intent = new Intent( getApplicationContext(), DrugDetailActivity.class ); intent.putExtras(bundle); startActivity ( intent ); } }); protected void onDestroy() { super.onDestroy(); DatabaseHelper.closeDatabase(); 리스트뷰의 한 아이템 선택했을 때 상세 화면으로 이동 7 5. 약품정보 데이터베이스 구성하기 Continued..
메인 액티비티 만들기 (계속) 8 커서의 데이터를 이용해 아이템을 만든 후 어댑터에 추가 5. 약품정보 데이터베이스 구성하기 public void AddCursorData ( Cursor outCursor ) { int recordCount = outCursor.getCount(); println("cursor count : " + recordCount + "\n"); adapter.clear(); int drugCodeCol = outCursor.getColumnIndex("DRUGCODE"); int drugNameCol = outCursor.getColumnIndex("DRUGNAME"); int prodKNameCol = outCursor.getColumnIndex("PRODKRNM"); int distrNameCol = outCursor.getColumnIndex("DISTRNAME"); Resources res = getResources(); for (int i = 0; i < recordCount; i++) { outCursor.moveToNext(); String drugCode = outCursor.getString(drugCodeCol); String drugName = outCursor.getString(drugNameCol); String prodKName = outCursor.getString(prodKNameCol); String distrName = outCursor.getString(distrNameCol); adapter.addItem(new IconTextItem(res.getDrawable(R.drawable.capsule1), prodKName,drugCode ,drugName,distrName)); } outCursor.close(); public void println(String msg) { Log.d(TAG, msg); 커서의 데이터를 이용해 아이템을 만든 후 어댑터에 추가 8 5. 약품정보 데이터베이스 구성하기
실행 화면 검색된 약품 리스트와 약품의 상세 보기 화면 5. 약품정보 데이터베이스 구성하기
참고 문헌 [ References] References 기본 서적 2013, 정재곤, “Do it! 안드로이드 앱 프로그래밍(개정판)”, 이지스퍼블리싱(주) Android Website http://www.android.com/ Google Developer’s Conference http://code.google.com/events/io/ Android SDK Documentation References