09. 데이터저장
시작하면서 2 목차 프레퍼런스 데이터베이스저장 컨텎트제공자
프레퍼런스
프레퍼런스 (Preference) 4 제일단순한저장형태 각애플리케이션에고유한설정값을지정 < 키, 값 > 의조합으로데이터저장 값에이름을부여하여저장 홖경설정에유용 주요메소드 SharedPreference 인터페이스 getsharedpreference() 에의해반홖된프레퍼런스객체를접근 / 수정제공 SharedPreference.Editor editor = pref.edit() 프레퍼런스객체를수정후, commit() 연산으로배치로처리
프레퍼런스 5 < 실습 9-1> 공유프레퍼런스설정 프로젝트 SharedPreference 를생성 < 코드 9-1> 를 main.xml 에복사 < 코드 9-2> 를 SharedPreference.java 에복사 특기사항 : 편집텍스트입력및체크박스표시후 DDMS 에서애플리케이션종료후재실행을통해프레퍼런스값이영속적임을확인 <SharedPreference.java> public void oncreate(bundle savedinstancestate) { SharedPreferences pref = getsharedpreferences("pref", Activity.MODE_PRIVATE); String text = pref.getstring("edittext", ""); edit1.settext(text); } public void onstop(){ SharedPreferences pref = getsharedpreferences("pref", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); editor.putstring("edittext", edit1.gettext().tostring()); editor.commit(); }
프레퍼런스 6
데이터베이스저장
데이터베이스저장 8 관계형데이터베이스 relational database 를이용 표형태의데이터관리 안드로이드에서내장형데이터베이스 SQLite 제공 파일과데이터베이스는자싞이생성된애플리케이션에종속 주요기능 데이터베이스생성과버젂부여 데이터베이스관리를위한클래스 적젃한 SQL 명령문과질의문작성을보조하는클래스 질의결과를탐색하기위한커서클래스 커서 Cursor 클래스 SQLite 데이터베이스의데이터나콘텎츠제공자가제공하는데이터에접근 복수의데이터들을순차적으로처리하는경우주로사용 SQLite 데이터베이스접근방식 1. 코드에서생성 / 접근하는방식 2. ADB 쉘인터페이스에서명령행도구 sqlite3 를이용해데이터베이스를직접조작하는방식
데이터베이스실습 9 실습내용 데이터베이스생성 SQLiteDatabase.create() 을호출 SQLiteOpenHelper를호출 데이터베이스에레코드를삽입 insert, 갱싞 update, 삭제 delete 하는실습 데이터베이스이름 : school 테이블이름 : students 실습순서 삽입연산 : students에 5개항목을삽입 변경연산 : students의 2번항목을변경 삭제연산 : students의 1번항목을삭제 3 개액티비티로구성 <activity android:name=".insertactivity > </activity> <activity android:name="updateactivity"></activity> <activity android:name="deleteactivity"></activity>
데이터베이스실습 10 < 실습 9-2> 데이터베이스실습 DatabaseDemo 프로젝트생성 < 코드 9-3> 을 AndroidManifest.xml 에복사 < 코드 9-4> 를 insert.xml 에복사 < 코드 9-5> 를 InsertActivity.java 에복사 < 코드 9-6> 을 InsertActivity.java 의끝에추가 < 코드 9-7> 을 update.xml 에복사 < 코드 9-8> 을 UpdateActivity.java 에복사 < 코드 9-9> 를 delete.xml 에복사 < 코드 9-10> 을 DeleteActivity.java 에복사 < 코드 9-11> 을 DBAdapter.java 에복사 < 코드 9-12> 를 DBAdapter.java 의끝에추가 삽입 ( 레코드 5 개 ), 변경 ( 레코드 1 개 ), 삭제 ( 레코드 1 개 ) 연산을차례로수행
데이터베이스실습 : 삽입 11
데이터베이스실습 : 변경 12
데이터베이스실습 : 삭제 13
데이터베이스실습 : 코드부분
데이터베이스실습 : 삽입부 15 InsertActivitiy DBAdapter db = new DBAdapter(this); db.open(); id = db.inserttitle( 홍길동, 컴퓨터, 2 ); Cursor c = db.getalltitles(); If ( c.movetofirst() ) { alltables = alltables.concat( ); while ( c.movetonext() ); db.close(); startactivity(new Intent(InsertActivity.this, UpdateActivity.class));
데이터베이스실습 : 변경부 16 UpdateActivitiy DBAdapter db = new DBAdapter(this); db.open(); id = db.updatetitle(2, 박주영, 기계, 1 ); Cursor c = db.getalltitles(); If ( c.movetofirst() ) { alltables = alltables.concat( ); while ( c.movetonext() ); db.close(); startactivity(new Intent(UpdateActivity.this, DeleteActivity.class));
데이터베이스실습 : 삭제부 17 DeleteActivitiy DBAdapter db = new DBAdapter(this); db.open(); id = db.deletetitle(1); Cursor c = db.getalltitles(); If ( c.movetofirst() ) { alltables = alltables.concat( ); while ( c.movetonext() ); db.close(); deletedatabase(dbadapter.getdatabasename());
데이터베이스실습 : DB, Table 생성 18 DBAdapter 항목명 ( 주키 ), 데이터베이스명, 테이블명 public static final String KEY_ROWID = "_id"; private static final String DATABASE_NAME = "school"; private static final String DATABASE_TABLE = "students"; // SQL 문 : create a table private static final String TABLE_CREATE = "create table students (_id integer primary key autoincrement, " + "name text not null, dept text not null, " + "grade text not null);"; // create a database if it doesn t exist, or open if it exists db = DBHelper.getWritableDatabase(); // create a table db.execsql(table_create);
데이터베이스실습 : helpers 19 DBAdapter // inserttitle ContentValues initialvalues = new ContentValues(); initialvalues.put(key_name, name); return db.insert(database_table, null, initialvalues); // deletetitle db.delete(database_table, KEY_ROWID + "=" + rowid, null) > 0 // updatetitle db.update(database_table, args, KEY_ROWID + "=" + rowid, null) > 0
데이터베이스실습 : 질의부 20 DBAdapter // getalltitles db.query(database_table, new String[] { KEY_ROWID, KEY_NAME, KEY_DEPARTMENT, KEY_GRADE}, null, null, null, null, null); // gettitle Cursor mcursor = db.query(true, DATABASE_TABLE, new String[] { KEY_ROWID, }, KEY_ROWID + "=" + rowid, null, ); if (mcursor!= null) mcursor.movetofirst(); return mcursor;
컨텐트제공자
컨텐트제공자 22 애플리케이션이저장한데이터를다른애플리케이션들이갂편하게접근할수있는방법 가장자연스러운애플리케이션갂데이터공유방법예 ) 연락처리스트, 브라우저의북마크, 음악이나사젂등의미디어저장 media store 접근시적합 안드로이드에서는데이터저장작업과홗용작업을붂리 컨텎트제공자는데이터를저장및관리하는역할을수행 애플리케이션은컨텎트제공자가제공하는데이터를홗용 애플리케이션은 ContentResolver 객체를사용하여컨텎트제공자에게요청 자료공유방법 사용자는컨텎트리졸버와 URI를통해컨텎트제공자에게원하는데이터를요청 컨텎트제공자는사용자에게요청받은데이터를제공 URIUniform Resource Identifier 데이터에대한접근형식 scheme://authority/path/id 주요컨텎트제공자 : < 표 9-1>
내부데이터베이스접근 23 내부데이터베이스에저장된젂화통화기록접근 1)ADB 를통한접근 : [ 그림 9-5] Adb shell 명령으로 sqlite3 을실행하여젂화통화기록조회
내부데이터베이스접근 24 2)DDMS 를통한접근 : [ 그림 9-6]
컨텐트제공자실습 25 이름과젂화번호로구성된젂화통화기록을검색 데이터에대한접근권한명시필요 < 실습 9-3> 콘텐트제공자실습 PhoneHistoryDemo 프로젝트생성 < 코드 9-13> 을 main.xml에복사 < 코드 9-14> 로 AndroidManifest.xml을수정 < 코드 9-15> 를 CallLogDemo.java에복사
컨텐트제공자실습 26 <AndroidManifest.xml> <uses-permission android:name="android.permission.read_contacts"> </uses-permission> <PhoneHistoryDemo.java> private static String[] PROJECTION = new String[] { Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER }; Cursor c = getcontentresolver().query(phone.content_uri, PROJECTION, null, null, null); startmanagingcursor(c); ListAdapter adapter = new SimpleCursorAdapter(this android.r.layout.simple_list_item_2, c, new String[] {Phone.DISPLAY_NAME, Phone.NUMBER}, new int[] {android.r.id.text1,android.r.id.text2}); setlistadapter(adapter);