Presentation is loading. Please wait.

Presentation is loading. Please wait.

Sookmyung Women’s Univ. PSLAB Ohe, heejung

Similar presentations


Presentation on theme: "Sookmyung Women’s Univ. PSLAB Ohe, heejung"— Presentation transcript:

1 Sookmyung Women’s Univ. PSLAB Ohe, heejung
8장. Persistent Storage Sookmyung Women’s Univ. PSLAB Ohe, heejung

2 Introduction 무선 장치들의 메모리 데이터베이스 Application의 실행에 필요한 메모리
데이터의 Persistent Storage를 위한 메모리 Application에서 그 데이터를 계속해서 사용하도록 지속적 시간이 지나면 바뀔 수 있는 개인 설정이나 정보를 저장 데이터베이스 출력,저장, 조작 액세스 등의 작업을 제공하는 크고 지속적이며 통합적인 동적 데이터의 집합체 J2ME의 MIDP : RMS( Record management system) Table: record store javax.microedition.rms RMS : 레코드 지향적인 간단한 데이터베이스 시스템 시스템의 각 테이블이 record store이고 record에 접근하고 저작하는 API는 javax.. Dp vhgka

3 Introduction Javax.microedition.rms Calsses Interface Exception
RecordStore, RecordEnumeration Interface RecordComparator, RecordFilter, RecordListener Exception InvalidRecordIDException RecordStoreException RecordStoreFullException RecordStoreNotFoundException RecordStroeNotOpenException Exception : 1. 동일한 id가 없을경우 2. record store의 이름이 너무 길거나 파일이 손상되었을경우 3. 메모리가 충분치 않아서 레코드를 생성할 수 없을경우 4. 해당 이름의 record store가 발견되지 않을경우 5. 해당 이름의 record store가 열리지 않을경우

4 1. Record Store

5 1.1 Record Store 조작하기 RMS Recore Store 조작하기 단순한 파일로 이루어진 데이터베이스 시스템
Recordstore class를 통해 조작 Recore Store 조작하기 public static RecordStore openRecordStore ( String recordStoreName, BooleancreateIfNecessary) public void closeRecordStor() Public static void deleteRecordStore (String recordStoreName) Recordstore openrecordstore에서 true일 경우는 레코드가 없다면 새로 생성되고 false이면 해당 이름의 레코드가 없다면 recordstorenotfound exception이 발생

6 1.1 Record Store 조작 예제 import javax.microedition.midlet.*; import javax.microedition.rms.*; public class RecordStoreTest1 extends MIDlet { public RecordStoreTest1() { } public void startApp() throws MIDletStateChangeException { RecordStore rs=null; try { rs = RecordStore.openRecordStore("file1",true); System.out.println("record store file1 is opened."); }catch(Exception e){ System.out.println("Error: "+e.getMessage()); finally{ // record store 닫기 rs.closeRecordStore(); System.out.println("record store file1 is closed"); }catch (Exception e){ destroyApp(true); notifyDestroyed(); /** * MIDlet의 실행을 중지한다. */ public void pauseApp() { * 어플리케이션이 언로드되기 전 프레임워크에서 호출한다. public void destroyApp(boolean unconditional) { - Record stroe는 사용을 마치면 반드시 닫아줘야 한다. -> 디바이스의 자원 소비 실제로 closeRecordStore 메소드는 실제로 store파일을 닫는게 아니라 application manager에게 record stroe의 사용이 끝났음을 알려준다. Record store를 사용한 모든 프로세스에게서 close 메소드가 날라와야 실제로 파일이 닫힌다. - 삭제 전에는 닫혀 있어야 한다.

7 1.2 Record Store 헤더 다른 파일 기반의 데이터베이스와 마찬가지로 record store도 헤더와 데이터 블록으로 구성 Data block : record store의 레코드 Data block은 LinkedList 처럼 서로 연결 데이터베이스의 작동 위해서는 헤더에 첫번째 데이터 블록에 대한 링크 있어야 한다. Record store header 정보 Record sotre 안의 레코드의 수 : public int getNumRecords() 버전 번호 (default :0 ) : public int getVersion() 최근 수정 시간 : public long getLastModified() 다음 레코드의 Id : public int getNextRecordID() 최근 수정시간 : 마지막 변경된 시간 버전번호는 레코드가 추가, 수정 , 삭제될때 증가, 버전이 증가함으로인해 미들릿에서는 다른 프로세스나 쓰레드에 의해 record store가 변경되었다는 사실 인지 다음 레코드의 id: 다음에 레코드가 추가될 때 레코드의 id, addrecord 불리어지면 id도 증가.

8 1.3 Record Store의 부가적 데이터 헤더에는 포함되지 않지만 implementation에서 제공하는 record store에 관한 나머지 정보 Public int getSizeAvailable() Record store에서 사용할 수 있는 여유 공간을 바이트 단위로 반환 반드시 미들릿에서 데이터를 저장하는데 사용할 수 있는 여유 공간과 일치하지는 않는다. Public int getSize() Record storerk 차지 하고 있는 공간을 바이트 단위로 반환 Public static String[] ListRecordStores() 현재의 MIDlet suite인 record store의 이름을 배열로 반환 여유공간 일치 -> 구현시에 native application과의 통합과 같은 추가적인 데이터 구조를 저장할 수 있으므로 반드시 일치하지는 않는다.

9 1.4 Record Store의 제약사항 MIDP 의 RMS API에서 초기화, 업데이트, 값 추출만 가능
Primary key인 recordId, byte array 형의 레코드 필드 다른 데이터베이스에서 지원하는 트랜잭션 컨트롤, 크래쉬 복구, 데이터 무결성 보장은 지원하지 않는다. 하나의 MIDlet suite 내에 여러 개의 미들릿이 있는 경우나 하나의 미들릿에 여러 개의 쓰레드가 있다면 각각에서 하나의 record store를 동시에 열고 액세스 가능

10 2. Record

11 2.1 Record Record Record store에 들어가는 값 Byte array형이며, recordId로 구별된다.
int addRecord (byte[] data, int offset, int numBytes) Defualt recordId는 1이며 레코드가 추가될때마다 이전 값에 1을 더한다. void deleteRecord (int recordId) RecordStoreNotOpenException InvalidRecordIdException RecordStoreException int getRecord (int recordId, byte[] buffer, int offset) Record 추출 byte[] getRecord (int recordId) void setRecord (int recordId, byte[] newData, int offset, int numBytes) Record 수정 Delete 시에는 지워진 부분이 빈칸으로 남는다.

12 2.2 Record 변경사항 모니터링 RecordListener Record store의 변경사항을 모니터링
Record store가 변경되면 이벤트가 등록된 RecordListener에 전달 recordChanged, recordAdded, recordDeleted의 세가지 이벤트 발생 void recordAdded (RecordStore recordStore, int recordId) void recordChanged (RecordStore recordStore, int recordId) void recordDeleted (RecordStore recordStore, int recordId) RecordListener등록 해제 void addRecordListener (RecordListener listener) void removeRecordListener (RecordListener listener) 하나의 객체에 여러 개의 리스너를 등록가능

13 3. RecordEnumeration

14 3.1 RecordEnumeration 레코드가 삭제되고 나면 record store 안의 recordId는 연속적이지 않다.
getRecord메소드를 이용해서 데이터를 추출한다면 삭제된 부분들은 InvalidRecordIDException이 발생 RecordEnumeration class는 양방향의 record store의 record enumerator 역할을 하는 class Public RecordEnumeration enumerateRecords (RecordFilter filter, RecordComparator comparator, boolean keepUpdated) KeepUpadate의 상태가 true로 enumerator를 생성하였다면 계속해서 현재 record의 변화를 감지 False이면 미들릿에서 rebuild() 메소드를 통해서 enumerator를 업데이터해줘야 한다. (정보 손실 vs 퍼포먼스 저하)

15 3.2 레코드 액세스와 이동 RecordEnumeration class의 API에서는 레코드 사이를 이동하고 레코드에 액세스 하는 메소드 제공 Void destroy() : 내부 리소스를 free 시켜준다. Boolean hasNextElement() : 다음 방향에 있는 element들 Boolean hasPreviousElement() : 이전 방향에 있는 element들 Byte[] nextRecord() : 다음 레코드 Int nextRecordId() : 다음 레코드 id Int numRecords() : 레코드의 갯수 Byte[] previousRecord() :이전 레코드 Int previousRecordId () : 이전 레코드의 id Void rebuild() Void reset()

16 4. 다중 컬럼 테이블 만들기

17 4.1 다중 컬럼 테이블 만들기 일반적으로 데이터베이스 테이블에는 자료형이 byte array인 하나의 데이터 필드만 존재
UTF-8 인코딩을 사용하여 여러 개의 필드를 하나의 레코드로 묶을 수 있다. -> 다중 컬럼 테이블 생성 DataInputStream DataOutputStream ByteArrayInputStream ByteArrayOutputStream Sun의 J2MEWTKdml RecordStore.setRecord() 메소드는 새 레코드의 데이터가 이전 데이터 보다 크기가 큰 경우 record store가 깨진다.

18 Record Filter, RecordComparator Interface

19 Record Fileter RecordComparator
Public Boolean matches(byte[] candidate) 메소드의 추출 기준을 정의 Candidate가 적용되는 규칙과 일치하면 true를 리턴 RecordComparator Int compare(bye[] rec1, byte[] rec2) Rec1과 rec2를 정렬 했을때 rec1이 rec2보다 앞에 있으면 RecordComparator.PRECEDES 반환 (value = -1) 같으면 RecordComparator.EQUIVALENT (value = 0) 뒤에 있으면 Recordcomparator.FOLLW (value = 1)


Download ppt "Sookmyung Women’s Univ. PSLAB Ohe, heejung"

Similar presentations


Ads by Google