9 강저장메커니즘
안드로이드데이터저장및관리기법 Shared Preferences 안드로이드 Java file IO SQLite Database
Android File system exploring 에뮬레이터의파일시스템을 adb 도구를이용해 shell 로탐색가능 Eclipse 의 DDMS, 를이용해탐색가능 Android 앱의 File system 영역. > adb shell > ls /data/app. eclipse > DDMS > File Explorer myapp.apk Activity Service AndroidManifast.xml Broadcast Content Provider Receiver install /data/app/<package_name>.apk /data/data/<package_name>/ data 영역 Preference 3 File: Context.openFileOutput Database
Preferences 특징 환경설정은안드로이드에서 <key-value> 쌍으로저장 / 조회할수있는메커니즘 저장형식은기본데이터타입, Maps, 배열로 XML파일로저장 보통애플리케이션의상태정보, 액티비티간의간단한데이터공유에주로사용 <key-value> 쌍의키의타입은문자열, 값은기본타입이어야한다. 설정정보는 Bundle과비슷하지만번들은저장기능이없음. 사용자는 SharedPreferences 를이용해데이터의조회및저장이가능
SharedPreference 종류앱을기준으로액티비티, 전체영역및 private 영역으로분류 ) getpreferences() /data/data/<package_name>/shared_prefs - 해당액티비티의설정정보에접근데이터를저장하는 XML 파일 - 액티비티의 private 영역에데이터를유지 <package_name>_preferences.xml ) getsharedpreference() - 애플리케이션내의콤포넌트들끼리의공유설정정보에접근 3) getdefaultsharedpreference() - PreferencesManager 를통해사용되며주어진 Context 의설정정보 <user defined name>.xml <Activity class name>.xml 3 Preferences 참조메서드 getxxx(key, default) putxxx(key, value) remove(key) : 해당 key 를제거 clear(): 설정지움 commit(): Editor 의설정저장. SharedPreference.Editor 클래스를통해기본형식의데이터저장지원
PreferenceActivity 소개 Preferences 를위한시스템환경설정화면을제공해서, xml 중심의환경설정프레임워크를제공. Preferences XML 정의 /res/xml 에설정화면레이아웃저장 <PreferenceScreen > <CheckBoxPreference /> <PreferenceCategory /> <PreferenceScreen/> PreferenceActivity 가화면을인플레이트 PreferenceActivity 앱설정저장 /data/data/<package-name>/shared_prefs/ <package_name>_preferences.xml 3 OnSharedPreferenceChangeListener() 설정저장 preference 형식으로동일하게저장
SharedPreference 실습소개 SharedPreference 에설정화면의변경값을저장하는예제 Activity 3 PreferenceActivity Menu 4 5 data 저장된결과 참조 : SG.PreferenceActivity.zip
SharedPreference 실습 코드분석 () 설정 UI xml 과액티비티선언 AndroidManifest.xml 두개의액티비티가선언됩니다. <activity android:name=".mypreferenceactivity" android:label="@string/app_name"> </activity> <activity android:name=".editpreferenceactivity" /> PreferenceAcvitiy 를구현 res/xml/settings.xml <PreferenceScreen android:key="preference_root" > <CheckBoxPreference.. android:key= checkbox /> <EditTextPreference /> <PreferenceCategory android:key= category > <ListPreference android:key= textcolor /> <ListPreference android:key= msgsize /> <RingtonePreference /> </PreferenceCategory> <PreferenceCategory.. > <PreferenceScreen android:key="sub_pref > <CheckBoxPreference /> </PreferenceScreen> </PreferenceCategory> </PreferenceScreen> 설정화면선언설정체크박스요소설정분류추가요소설정 List 요소공유설정저장 key 참조 : SG.PreferenceActivity.zip
9. 저장기법 SharedPreference 실습 코드분석 () Activity 분석 MyPreferenceActivity class public class MyPreferenceActivity extends Activity {. protected void onresume() {. retrivepreferences(); protected void onactivityresult(int requestcode, int resultcode, Intent data) { retrivepreferences(); EditPreferenceActivity class public class EditPreferenceActivity extends PreferenceActivity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); addpreferencesfromresource(r.xml.settings); private void retrivepreferences() { SharedPreferences prefs = PreferenceManager. getdefaultsharedpreferences(getapplicationcontext()); 공유환경설정객체를만듭니다. String color = prefs.getstring("textcolor", "#FFFFFF"); String msg = prefs.getstring("newmsg", "<NONE>"); int size = Integer.parseInt( prefs.getstring("msgsize", "0") ); boolean check = prefs.getboolean("checkbox", false); checkbox.settext( new Boolean(check).toString()); added.settext( msg ); added.settextcolor(color.parsecolor(color)); added.settextsize(size); xml 로선언된설정화면 UI 를 content view 로설정 설정 key 의값을 String 으로가져옵니다. 참조 : SG.PreferenceActivity.zip
File 안드로이드는 Java 의 IO 를이용해 File 에접근. 파일은단말의내장메모리나 SDCARD 에저장. Networked IO 도가능. File IO 이용 FileInputStream Context.openFileInput(String path) 파일로부터의데이터를읽기. FileOutputStream Context.openFileOutput(path, [MODE]) 파일에쓰기 - 존재하지않는파일명을제시하면그파일을만들어준다. [MODE] 파일저장 / 읽기모드 Context.PRIVATE Context.MODE_APPEDN Context.MODE_WORLD_READABLE Context.MODE_WORLD_WRITABLE
File 코드분석 () 간단하게내장데이터에입력된문자를쓰는코드를살펴보자. 3 저장될파일 입력된내용을 DATAFILE 에쓴다
File 코드분석 () DATAFILE을읽어화면에표시하고, 종료시수정된내용을저장 파일을읽는다. 앱이종료하는시점에 EditText 의수정된내용을 DATAFILE 에씁니다. 화면의 EditText 에읽어온내용을표시한다.
File: resource file 및 assets 이용. res/raw 파일사용법 res/raw 디렉토리에추가한특정파일을읽어애플리케이션에서파일로작업. raw/mymusic.mp3 파일을읽는예제 InputStream is = openrawresource( R.raw.mymusic ); FileOutputStream fos = new FileOutPutStream( is);. res/xml 폴더보통 xml 로구성된데이터파일처리에사용. getresources().getxml(r.xml.people_list); 3. assets 폴더사용법이미지, 음원, 영상등안드로이드리소스와분리된 assets 폴더영역을사용. AssetManager myasset = getresources().getassets(); myasset.list(path) myasset.open(path)
Files on SDCARD 안드로이드단말은대부분외장메모리, SDCARD 를장착이가능. - SD 카드는내장메모리에비해고용량메모리. - WRITE_EXTERNAL_STORAGE 권한만획득하면파일을작성 / 관리가능 AndroidManifest.xml <uses-permission android:name="android.permission.write_external_storage" /> SDCard 에서파일처리예제 File imagefile = new File("/sdcard/DCIM/Camera/00-03-07 4.49.3.jpg"); if (imagefile.exists()) { imagefile.createnewfile() File testfile = new File( /sdcard/testfile.txt ); FileOutputStream fos = new FileOutputStream(testFile); OutputStreamWriter outtestfile = new OutputStreamWriter(fos); outtestfile.append( lskdjdsljslfjlfjlfs; ); outtestfile.close(); fos.close();
SQLite Database 소개 안드로이드는 SQLite3 데이터베이스를임베디드데이터베이스로제공 Contents Provider 어떤데이터소스와도연결가능한인터페이스제공 오픈소스로표준을잘준수한가볍고단일계층으로된데이터베이스이다. 3 4 지원되는 SQL create database, define SQL tables, indices queries views triggers insert / delete / change rows run queries SQLite3 DB Admin
SQLite 특징 SQL-9 표준지원 trigger 를부분적으로지원. 복잡한쿼리가능 ( outer join 제외 ) foreign key 를이용한참조무결성은지원하지않음 변형된데이터타입모델을사용 전체칼럼공통된타입을할당하지않고각각의데이터마다타입을다르게지정할수있음. 따라서숫자타입의칼럼에문자열을넣는것도가능. 저장위치 : /data/data/<package_name>/databases 테이블에자동증가키사용 ( 인덱스키로사용 )
9. 저장기법 SQLite 주요코딩요소 - 실제 SQLiteDatabase 를이용하기위해서는아래 3 가지클래스를이용. SQLiteOpenHelper class SQLiteDatabase 획득을위한 Helper class oncreate(sqlitedatabase), onupgrade(sqlitedatabase, int, int) 클래스는 DB 가있으면열고, 없으면새로만든다. 또한필요하면 DB 를업그레이드함. SQLite Database class 이클래스는 create, delete, execute SQL commands 메소드를가지고있음. DDL 용 insert(), delete, query, execsql() 등메서드제공. 이클래스를얻기위해서는위의헬퍼클래스를생성하여 getwritabledatabase() 메소드를통해얻고, 이클래스는위의 SQLiteOpenHelper 클래스의 oncreate, onupgrade 에서파라미터로사용됨. 3 Cursor interface 이인터페이스는 DB 쿼리로부터의결과셋에랜덤으로 read, write 하는기능을제공한다. 즉, DB 쿼리결과로이커서를받고, 이커서의메소드인 getstring() 등을이용해서 key 값 ( 컬럼명 ) 을넘겨주고, 매칭되는값 ( 해당데이터 ) 을추출한다. 또한 SimpleCursorAdapter 와같은 Adapter 클래스의생성자에넘겨주어, 레이아웃에 DB 쿼리의결과값을매칭시켜보여줄수있도록함.
SQLite 코드분석 - database 생성 private static String DATABASE_NAME = "testdb.db"; private static String DATABASE_TABLE = "test_table"; private static int DATABASE_VERSION = ; database 이름선언 Helper class 선언 private class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper( Context context) { super( context, DATABASE_NAME, null, DATABASE_VERSION); @Override public void oncreate(sqlitedatabase db) { db.execsql("create TABLE " + DATABASE_TABLE + "(" + "_id INTEGER PRIMARY KEY," + "lastname VARCHAR, " + 3 "firstname VARCHAR, " + "country VARCHAR, " + "age INT(3));"); version 은 database upgrade 마다증가 db 생성 4 String sql_insert = "INSERT INTO " + DATABASE_TABLE + "(lastname, firstname, country, age) " + "VALUES "; db.execsql( sql_insert + "(' 홍 ',' 길동 ',' 대한민국 ', 0);"); @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql("drop TABLE IF EXISTS " + DATABASE_TABLE); oncreate(db); db upgrade 관리 insert row version 정보
SQLite 코드분석 - database query mopenhelper = new DatabaseHelper(this); SQLiteDatabase db = mopenhelper.getreadabledatabase(); database 얻기 6 Cursor cursor = db.query( DATABASE_TABLE, new String[] {"lastname","firstname","country","age", null, null, null, null, null); try { 3 int i = 0; if (cursor.movetofirst()) { do { 4 Cursor 에 data 가있으면첫번째 data 행으로이동 i++; String firstname = c.getstring(c.getcolumnindex("firstname");); String lastname = c.getstring(c.getcolumnindex("lastname");); String country = c.getstring(c.getcolumnindex("country");); int age = c.getint(= c.getcolumnindex("age");); item.add("" + i + ":" + firstname + lastname + "(" + country + ":" +age + ")"); 5 while (cursor.movetonext();); 다음행 data finally { if (c!= null) cursor.close(); ArrayAdapter<String> filelist = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_, item); setlistadapter(filelist); ListView 에 Adapter 추가 Cursor 객체얻기 Cursor 의컬럼에해당하는데이터를가져온다
SQLite 실습예제 입력필드 db 내용을보이는 ListView 참고 : SG.storage.DB.zip
SQLite 명령행에서 adb 로 SQLite 명령어사용 - SQL 문장으로데이터를조회, 갱신가능 형식 : sqlite3 data_file adb 로 shell 환경으로들어갑니다. Android Contacts db 살펴보기 #adb shell # ls /data/data/com.android.providers.contacts/databases # sqlite3 /data/data/com.android.providers.contacts/databases/contacts.db ls 명령으로 file 이있는지확인 SQLite 명령어 sql 문장을제외한, 모든명령은 '.' 으로시작합니다. sqlite3 로 database file 을읽어들입니다..table : 데이터베이스내의모든테이블을나열합니다..header on : 쿼리결과를표시할때맨위에열이름을같이표시합니다..mode column : 쿼리결과를표시할때각열들사이를적당히띄워주어보기편하도록표시합니다..exit : sqlite3 툴을종료합니다.
9. 안드로이드저장장치 SQLite 3 SQLite database 조회실습 C:\Users\james>adb shell # ls /data/data/com.sgap.exam.database/databases testdb.db # sqlite3 /data/data/com.sgap.exam.database/databases/testdb.db SQLite version 3.5.9 Enter ".help" for instructions sqlite>.tables sqlite> select * from test_table; select * from test_table; 홍 길동 대한민국 0 james goh korea 40. adb 로 shell 환경으로들어갑니다.. database file 을읽어들이고 sqlite 쉘로변경합니다. 3. test_table 에저장된 row 를 select 합니다. 4 참고 : 윈도우 cmd 에서 UTF-8 한글표시하는방법 http://underclub.tistory.com/60