68
WIPI 플플플플플플 플플플 / 플플플 플플플 플플 2004. 9.

WIPI 플랫폼에서의 그래픽 / 데이터 베이스 기능

  • Upload
    zody

  • View
    75

  • Download
    0

Embed Size (px)

DESCRIPTION

WIPI 플랫폼에서의 그래픽 / 데이터 베이스 기능. 2004. 9. 그래픽 (Graphics) 패키지 : org.kwis.msp.lcd. 그래픽 패키지의 클래스 상속도. Object. JletEventListener. InputMethodListner. ImageObserver. Jlet. Card. Display. Font. Graphics. Image. EventQueue. InputMethodListener. 그래픽 (Graphics) 패키지. Graphics 클래스 - PowerPoint PPT Presentation

Citation preview

Page 1: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

WIPI 플랫폼에서의 그래픽 / 데이터 베이스 기능

2004. 9.

Page 2: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

그래픽 (Graphics) 패키지: org.kwis.msp.lcd

그래픽 패키지의 클래스 상속도

Object

Jlet Card Display Font Graphics Image EventQueue InputMethodListener

JletEventListener

InputMethodListner

ImageObserver

Page 3: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

그래픽 (Graphics) 패키지

Graphics 클래스 2 차원 기하학적 도형을 그리는 기능 제공 원점 (0,0): 좌측 상단

• Translate 함수에 의해 변경 가능

Graphics 클래스에서 좌표체계

Page 4: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

그래픽 (Graphics) 패키지 예제 1

import org.kwis.msp.lcdui.*;import org.kwis.msp.lwc.*;

public class Example1 extends Jlet { // 프로그램이 시작될 때 불려진다 . protected void startApp(String args[ ]){ Display dis=Display.getDefaultDisplay( ); dis.pushCard(new SampleCard( )); }

protected void pauseApp( ){ } protected void resumeApp( ){ } protected void destroyApp(boolean b){ }}

Java 의 파일이름과 Jlet 클래스의 이름이 같아야한다 .Ex) Example1.java Jlet 클래스 Example1

Page 5: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

그래픽 (Graphics) 패키지 예제 1

class SampleCard extends Card{ public void paint(Graphics g){ int width = getWidth( ); int height = getHeight( );

g.setColor(0xff0000); g.fillRect(0,0,width/2,height/2);

g.setColor(0x00ff00); g.fillRoundRect(width/2, 0, width/2, height/2, width/4, height/4);

g.setColor(0x0000ff); g.fillArc(0, height/2, width/2, height/2, 0, 270); }}

Page 6: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

그래픽 (Graphics) 패키지 예제 1

Card : 그림을 그리기위한 도화지 Graphics 클래스 : 그림을 그리기 위한 도구 화면의 크기

• 넓이 : getWidth(), 높이 : getHeightfillRect(x, y, width, height) fillRoundRect(x, y, width, height, arcwidth, archeight)fillArc(x, y, width, height, startAngle, arcAngle)

Page 7: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

선 (Stroke) 그리기

class SampleCard extends Card{

public void paint(Graphics g){

int width = getWidth();int height = getHeight();

// Default SOLIDg.setStrokeStyle(Graphics.SOLID);g.setColor(0xff0000);g.drawRect(1,1,width/2,height/2);

g.setStrokeStyle(Graphics.DOTTED);g.setColor(0x0000ff);g.drawRect((width/2)+1,(height/2)+1,

(width/2)-3,(height/2)-3);}

}

Page 8: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

XOR 테스트를 이용한 그림 그리기

class SampleCard extends Card {boolean keyInput = false;public void paint(Graphics g) {

if(keyInput==true) { g.setColor(0xffffff);

g.setXORMode(true); g.fillRect(30,30,getWidth()/2,getHeight()/2); keyInput = false;}

}protected boolean keyNotify(int type, int key) {

switch(Display.getGameAction(key)) { case 2 : // LEFT KEY if (type == 1 ) // KEY PRESSED { keyInput = true;

repaint(); }}return true;

}};

Page 9: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

투명도 (Alpha) 를 이용한 그림 그리기

class SampleCard extends Card{

public void paint(Graphics g){

g.setColor(0xff0000);g.fillRect(30,30,getWidth()/2,getHeight()/2);

g.setColor(0x00ff00);g.setAlpha(100);g.fillRect(60,60,getWidth()/2,getHeight()/2);

g.setAlpha(250);g.fillRect(0,0,getWidth()/2,getHeight()/2);

}};

Alpha 0 TransparencyAlpha 255 Opaque

Page 10: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

클리핑 (Clipping)

클리핑 불필요한 부분을 잘라냄 public void clipRect(int x, int y, int width, int height)

• 두개의 사각형의 교집합을 클리핑 영역으로 사용 public void setClip(int x, int y, int width, int height)

• 기존 클리핑 영역 무시

clipRect setClip

Page 11: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

클리핑 (Clipping)

class SampleCard extends Card {

int proc = 0;

public void paint(Graphics g) {

int width = getWidth();

int height = getHeight();

g.setColor(0xffffff);

g.fillRect(0,0,width,height);

Image img = null;

try

{

img = Image.createImage("test.gif");

}

catch (Exception e) {}

Page 12: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

클리핑 (Clipping)

switch(proc) {case 0 :

g.drawImage(img,0,0,Graphics.TOP); break;case 1 :

g.setClip(0,0,width/2+30,height/2+30); g.drawImage(img,0,0,Graphics.TOP); break;

case 2 :g.setClip(0,0,width/2+30,height/2+30); g.clipRect(width/2,height/2,width/2,height);g.drawImage(img,0,0,Graphics.TOP); break;

case 3 :g.setClip(0,0,width/2-5,height/2-5);g.drawImage(img,0,0,Graphics.TOP); g.setClip(width/2+5,0,width/2-5,height/2-5);g.drawImage(img,0,0,Graphics.TOP); g.setClip(0,height/2+5,width/2-5,height/2-5);g.drawImage(img,0,0,Graphics.TOP); g.setClip(width/2+5,height/2+5,width/2-5,height/2-5);g.drawImage(img,0,0,Graphics.TOP); break;

} img = null;}

Page 13: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

클리핑 (Clipping)

protected boolean keyNotify(int type, int key) {if (type==EventQueue.KEY_PRESSED) {

switch(Display.getGameAction(key)){

case EventQueue.RIGHT: proc=0;break;

case EventQueue.LEFT: proc=1;break;

case EventQueue.UP: proc=2;break;

case EventQueue.DOWN :proc=3;

}}repaint();return true;

}};

Page 14: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

이미지 클래스와 imageObserver 인터페이스

Image 클래스 이미지를 출력할 수 있는 클래스 png 나 gif 등의 이미지 파일 포맷으로 부터 생성

static Image createImage(byte[] imagedata, int imageoffset, int image length)

static Image createImage(Image image)

static Image createImage(int width, int height)

static Image createImage(String name)

static Image loadImage(String name, ImageObserver io)

Page 15: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

이미지 클래스와 imageObserver 인터페이스

Image 클래스 변경이 불가능한 이미지

• 이미지 파일로부터 생성한 이미지

변경 가능한 이미지• 복사된 이미지

Image img = Image.createImage(“image.gif”);Graphics g = img.getGraphics();

변경 불가능Exception 발생

Image img = Image.createImage(“image.gif”);Image copy = Image.createImage(img);Graphics g = copy.getGraphics();g.drawLine(……);

변경 가능

Page 16: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

이미지 클래스와 imageObserver 인터페이스

Image 클래스 애니메이션 이미지

• 복사할 수 없음 ( 변경이 불가능 )

• play(imageObserver io) animated gif 수행 • stop() 실행 중지• stopImage(ImageObserver io) 로딩 중지

애니메이션 이미지와 이미지 변환가능성 확인 여부• Boolean isAnimate() 애니메이션 이미지인가 ?

• Boolean isMutable() 변경이 가능한가 ?

Page 17: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

이미지 클래스와 imageObserver 인터페이스

이미지 옵저버 (ImageObserver) 이미지의 생성상태를 볼 수 있게 해주는 인터페이스 각 프레임마다 이미지 생성 여부를 알려줌 void notify(Image img, int status)

• 정상적으로 수행되는 경우 : play 수행시 ImageObserver 가 notify 를 주기적으로 호출

• notify 함수안에서 이미지를 다시 그리기 위해 repaint 를 호출하여 새로운 프레임을 그리게 함

• status– DECODE_ERROR : 디코딩 결과 오류– FRAME_END : 한프레임이 다 끝난 경우– IMAGE_END : 이미지 전체 디코딩 완료– NOT_EXIST: 디코딩 결과 오류– OUT_OF_MEMORY: 디코딩 결과 오류

Page 18: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

ImageTest 예제

class SampleCard extends Card implements ImageObserver{

Image img = null;Image copy = null;int notifyCounter = 0;

public SampleCard(){

try{

img = Image.createImage("ani.gif");copy = Image.createImage(Image.createImage("copy.gi

f"));}catch (Exception e){}

}

Page 19: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

ImageTest 예제

public void paint(Graphics g){

g.drawImage(img,0,0,Graphics.LEFT);img.play(this);

g.setClip(0,img.getHeight(),getWidth(), getHeight()-img.getHeight());

Graphics imgGraphics = copy.getGraphics();imgGraphics.setColor(0xffffff);imgGraphics.fillRect(0,getHeight()-15,copy.getWidth(),15);imgGraphics.setColor(0x000000);

imgGraphics.drawString("Notify counter : "+notifyCounter, 1,getHeight()-3,Graphics.BOTTOM);

g.drawImage(copy,0,0,Graphics.LEFT);}public void notify(Image img, int status){

notifyCounter++;repaint();

}};

Page 20: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

문자열 출력과 앵커의 활용

문자열 출력 함수 drawChar(char character, int x, int y, int anchor) drawChars(char[] data, int offset, int length, int x, int y, int anchor) drawString(String str, int x, int y, int anchor) drawSubstring(String str, int offset, int len, int x, int y, int anchor)

앵커 (Anchor) 이미지나 폰트 등을 출력할 때 위치를 결정하는 함수

앵커 (Anchor) 스타일 (Style)

수직

TOP

BASELINE

BOTTOM

VCENTER (image 경우에만 )

수평LEFT

HCENTER

RIGHT

Page 21: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

문자열 출력과 앵커의 활용

앵커 수직과 수평을 OR 를 이용하여 동시에 사용가능Ex) TOP | LEFT LEFT, HCENTER, RIGHT 위치

TOP, BASELINE, BOTTOM 위치

Page 22: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) 수평 스타일로 문자열 출력

class SampleCard extends Card{

public void paint(Graphics g){

int width = getWidth();int height = getHeight();

g.setColor(0xff00000);g.drawLine(width/2,0,width/2,height);

g.setColor(0x000000);g.drawString("LEFT",width/2,25,Graphics.LEFT);g.drawString("RIGHT",width/2,55,Graphics.RIGHT);g.drawString("HCENTER",width/2,85,Graphics.HCENTER);

}};

Page 23: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) 수직 스타일로 문자열 출력

class SampleCard extends Card{

public void paint(Graphics g){

int width = getWidth();int height = getHeight();

g.drawLine(0,height/2,width,height/2);

g.drawString("TOP",10,height/2,Graphics.TOP);g.drawString("BASELINE",30,height/2,

Graphics.BASELINE);g.drawString("BOTTOM",80,height/2,

Graphics.BOTTOM);}

};

Page 24: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

폰트 활용

폰트 함수 static Font getDefaultFont() static Font getFont(int face, int style, int size)

• face 인수 값– FACE_MONOSPACE– FACE_PROPORTIONAL– FACE_SYSTEM

• style 인수 값 (OR 를 이용하여 조합할 수 있다 )– STYLE_BOLD– STYLE_ITALIC– STYLE_PLAIN– STYLE_UNDERLINED

• size 인수 값 – SIZE_SMALL– SIZE_MEDIUM– SIZE_LARGE

IllegalArgumentException 인수값이외의 값들이 입력될 경우 발생

Page 25: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) 폰트 활용

class SampleCard extends Card

{

private int [] Styles = { Font.STYLE_PLAIN, Font.STYLE_UNDERLINED, Font.STYLE_BOLD,

Font.STYLE_BOLD | Font.STYLE_UNDERLINED,

Font.STYLE_ITALIC,

Font.STYLE_ITALIC | Font.STYLE_UNDERLINED,

Font.STYLE_BOLD | Font.STYLE_ITALIC,

Font.STYLE_BOLD | Font.STYLE_ITALIC | Font.STYLE_UNDERLINED };

private int [] size = { Font.SIZE_SMALL, Font.SIZE_LARGE, Font.SIZE_MEDIUM };

Page 26: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) 폰트 활용

public void paint(Graphics g){

int x = 0;int y = 0;for (int j=0; j<2; j++) {

for (int i=0;i<Styles.length;i++) { g.setFont(Font.getFont(Font.FACE_SYSTEM, Styles[i],size[j])); g.drawString(" 가나 ABC",x,y,Graphics.TOP); if (x==0) x=60;

else { x = 0; y+=15; };}y += 20;

}}

};

Page 27: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

이벤트 (Event) 활용

Event 함수 모든 이벤트는 스택 상위의 카드로 전달 protected boolean keyNotify(int type, int key)

• 키패드 입력을 받아들이는 함수 protected boolean pointerNotify(int type, int x, int y)

• 터치패드 입력을 받아들이는 함수 protected void showNotify(boolean bShow)

• popcard, pushCard 등으로 카드를 보여지거나 감춰지거나 할때 발생하는 이벤트 함수

Page 28: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

이벤트 (Event) 활용

protected boolean keyNotify(int type, int key)• type 인수

– KEY_PRESSED, KEY_RELEASED, KEY_TYPED, KEY_REPEATED

• key 인수 – 시스템마다 다르게 설정

key 값을 얻어 수행여부나 해당 key 에 대칭되는 방향기능 이벤트 지원

• Static int getGameAction(int key)

• Static int getKeyCode (int gamekey)

• 지원 키– EventQueue.UP, EventQueue.DOWN– EventQueue.LEFT, EventQueue.RIGHT 등등

Page 29: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) keyNotify

class SampleCard extends Card{

boolean keyInput = false;String keyCode = "";int keyValue = 0 ;

public void paint(Graphics g){

g.setColor(0xffffff);g.fillRect(0,0,getWidth(),getHeight());g.setColor(0x000000);g.drawString(" 아무키나 눌러주세요 " ,5,10,Graphics.TOP);g.drawString(" 입력된 키값은 : “ + keyValue, 5, 50,

Graphics.TOP);g.drawString( keyCode + " 입니다 ",5,70,Graphics.TOP);

}

Page 30: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) keyNotify

protected boolean keyNotify(int type, int key) {

keyValue = key;switch(Display.getGameAction(key)) { case EventQueue.CLEAR : keyCode = "CLEAR"; break; case EventQueue.DOWN : keyCode = "DOWN"; break; case EventQueue.UP : keyCode = "UP"; break; case EventQueue.LEFT : keyCode = "LEFT"; break; case EventQueue.RIGHT : keyCode = "RIGHT"; break; case EventQueue.FIRE : keyCode = "FIRE"; break; case EventQueue.SOFT1 : keyCode = "SOFT1"; break; case EventQueue.SOFT2 : keyCode = "SOFT2"; break; case EventQueue.SOFT3 : keyCode = "SOFT3"; break; case EventQueue.SIDE_SEL : keyCode = "SIDE_SEL"; break; case EventQueue.SIDE_UP : keyCode = "SIDE_UP"; break; case EventQueue.SIDE_DOWN : keyCode = "SIDE_DOWN"; break; default : char ch = (char)key; keyCode = (new Character(ch)).toString();}if (type == EventQueue.KEY_PRESSED) { repaint(); }return true;

}};

제어키 처리

일반키 처리

Page 31: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터베이스 (Database 패키지 ): org.kwis.msp.db

데이터베이스 패키지 핸드폰에 내장되어 있는 플래시 메모리에 데이터베이스 구성 데이터 베이스 생성 , 필요한 데이터 삽입 , 삭제 , 수정

Object

DataBase DataComparatorInteger DataComparoatorString DataFilterInteger

Exception

Interface DataComparator DataFilter

DataBaseRecordException

DataBaseException

Page 32: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터 베이스

데이터베이스 다양한 데이터들의 집합체 체계화된 데이터

데이터베이스 관리시스템 (DBMS) 데이터베이스를 생성 , 관리 사용자가 원하는 정보 추출 데이터베이스 관리언어 (Database Management Language)

• DBMS 가 데이터베이스르 관리할 때 쓰이는 명령 체계• SQL(Structured Query Language)

– 데이터베이스에서 정보를 얻거나 갱신하기 위한 표준화된 언어– Ex) Select, Insert, Update, Delete

Page 33: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터베이스 클래스

데이터베이스 클래스 플래시메모리에 데이터베이스를 생성하고 , 생성된

데이터베이스를 관리하는 DBMS 의 역할 특징

• 여러 개의 레코드로 구성• 각 레코드는 오직 한 개의 필드만을 가질 수 있음• 일반 DBMS 에 제공하는 DBL 은 제공하지 않음• 데이터베이스 정렬을 위해 DataFIlter 와 DataComparator

인터페이스 제공– DataFilter 레코드를 골라내는 역할– DataComparator 레코드 두개를 비교하는 역할

• 풀랫폼이 다운되더라도 이미 저장된 레코드라면 무결성 보장• 레코드는 바이트 Array 단위로 저장

– 데이터의 의미는 무시 , 논리적의미를 파악하는것은 사용자 몫

Page 34: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터베이스 클래스

• 레코드의 크기는 처음 해당 데이터베이스를 생성할 때 지정한 크기를 초과할 수 없음

• 레코드는 데이터베이스 상에서 레코드 ID 라는 정수값으로 표현– 레코드 ID : 0 부터 시작 – 레코드 하나를 저장할때마다 1 증가– 중간에 레코드가 삭제되면 다음 레코드를 저장할 때 삭제된 레코드 ID

를 재사용 데이터베이스 생성 모드

• PRIVATE– 이 DB 를 생성한 Jlet 은 접근 가능 , 다른 Jlet 은 이 DB 접근 불가능

• SHARED– 공유디렉토리에 저장 , 여러 Jlet 이 공유

• SYSTEM– 시스템 어플리케이션이 사용하는 디렉토리에 저장

• Jlet 이 플랫폼상에서 지워지면 DB 도 삭제됨

Page 35: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터베이스 생성 / 삭제 / 닫기

데이터베이스 생성 보통 클래스

• New 연산자를 이용하여 객체생성 DataBase 클래스

• openDataBase() 메소드를 이용하여 생성• 두가지 형태로 오버로딩

– public static DataBase openDataBase(String dbName, int recordSize, boolean craete) throws DataBaseException, IllegalArgumentException

– public static DataBase openDataBase(String dbName, int recordSize, boolean craete, int flag) throws DataBaseException, IllegalArgumentException

오버로딩 (Overloading)메소드 이름이 같더라도 인수의 자료형과 개수가 다르면 서로 다른 메소드로 인식

Page 36: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터베이스 생성 / 삭제 / 닫기

public static DataBase openDataBase(String dbName, int recordSize, boolean craete) throws DataBaseException, IllegalArgumentException

• dbNmae– 생성될 DB 이름

• recordSize– DB 의 레코드 크기를 byte 단위로 입력– DB 가 이미 존재하는 경우 기존 레코드 크기를 적용

• create– False: 기존 DB 를 오픈– True: 새로운 DB 생성

public static DataBase openDataBase(String dbName, int recordSize, boolean craete, int flag) throws DataBaseException, IllegalArgumentException

• flag– 데이터 공유방법 지정

» FileSytem.PRIVATE_ACESS, FileSytem.SHARED_ACESS, FileSytem.SYSTEM_ACESS

FileSystem.PRIVATE_ACCESS 인 DB 생성

Page 37: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터베이스 생성 / 삭제 / 닫기

예외 (Exception) 사항• DataBaseException

– DB 를 열수 없을 경우 발생– DB 가 깨진 경우 발생– create 인수가 false 인 경우 DB 가 없는 경우 발생

• IllegalArgumentException– create 인수가 true 인 경우

» recordSize 인수가 0 이거나 음수인 경우에 발생 DB 생성시 생성되는 파일

• .db– DB 파일 (DB 데이터가 담겨있음 )

• .idx– Index 파일 (DB 관리정보가 들어 있음 )

PRIVATE 모드 pri 폴더 , SHARED 모드 sh 폴더 , SYSTEM 모드 sys 폴더

Page 38: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터베이스 생성 / 삭제 / 닫기

데이터베이스 삭제하기 두가지 오버로딩 사용

• public static void deleteDataBase(String dbName) throws DataBaseException

– DB 접근모드가 FileSystem.PRIVATE_ACCESS 인 DB 삭제• public static void deleteDataBase(String dbName, int flag) thro

ws DataBaseException– 지정모드의 DB 만을 삭제

• DataBaseException 오류– 삭제할 DB 가 없거나 지우지 못할 경우에 발생

Page 39: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

데이터베이스 생성 / 삭제 / 닫기

데이터베이스 닫기 Public void closeDataBase() throws DataBaseException

• DB 를 닫을 때 사용• DataBaseException 오류

– idx 파일에 DB 관리정보 저장» 관리정보를 저장할 수 없을 때 발생

– db 파일을 닫을 수 없을 때 발생

Page 40: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 삽입 / 선택

레코드 삽입하기 하나의 레코드로 데이터베이스에 저장 저장할 바이트 길이가 지정한 레코드 크기보다 작으면 남은

영역에 쓰레기 (Garbage) 값이 저장• 바이트 Array 의 실제 데이터와 쓰레기 값의 구별은 사용자 몫

DataBase Name.insertRecord() 메소드 사용

Page 41: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 삽입 / 선택

public int insertRecord(byte[] data) throws DataRecordException, DataBaseException

• 저장된 레코드 ID 를 리턴• data 인수 : 저장할 데이터가 들어 있는 버퍼

public int insertRecord(byte[] data, int offset, int numBytes) throws DataRecordException, DataBaseException, IllegalArgumentException

• offset 인수 : 버퍼에서 저장할 데이터가 시작되는 첫번째 바이트

• numBytes 인수 : 저장할 바이트 수

0 1 2 3 4 5 6 7 8 9

예 ) 크기가 10 인 바이트 버퍼에 3~5번째까지를 레코드에 삽입 offset 2 , numBytes 3

Page 42: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 삽입 / 선택

예외 (Exception) 사항• DataBaseRecordException

– 지정한 레코드 크기보다 삽입할 데이터가 큰경우 발생• DataBaseException

– 레코드를 저장할 수 없는 경우 발생• IllegalArgumentException

– 바이트 버퍼의 길이 – offset < numBytes 인 경우 발생» Ex) offset 7, numBytes 5 인경우

0 1 2 3 4 5 6 7 8 9 ?? ??

10 - 7 < 5

Page 43: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 삽입 / 선택

레코드 선택하기 selectRecord() 메소드 사용

• public byte[] selectRecord(int recordId) throws DataBaseException, DataBaseRecordException

– 레코드 ID 에 저장된 데이터를 바이트 array 로 리턴• public void selectRecord(int recordId, byte[] buffer, int offset) th

rows DataBaseException, DataBaseRecordException, IllegalArgumentException

– 읽어들인 데이터를 복사해서 인수로 준 Buffer 에 복사해주는 방식– 버퍼의 내용을 바꾸더라도 DB 에 저장된 레코드는 변하지 않음– Buffer

» 읽어들인 데이터를 복사하여 저장할 버퍼– offset

» 인수로 준 버퍼에서 복사를 시작할 첫 번째 바이트 오프셋

Page 44: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 삽입 / 선택

예외 (Exception) 사항• DataBaseException

– 레코드를 읽을 수 없을 경우 발생• DataBaseRecordException

– 레코드 ID 가 존재하지 않을 경우 발생• IllegalArgumentException

– 버퍼가 레코드 크기보다 작은 경우 발생

Page 45: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) OpenDataBase

import org.kwis.msp.lcdui.Jlet;import org.kwis.msp.lcdui.Display;import org.kwis.msp.db.DataBase;import org.kwis.msp.io.FileSystem;public class OpenDataBase extends Jlet {

public OpenDataBase(){ }protected void startApp(String[] arg0){DataBase dataBASE1 = null;try { dataBASE1 = DataBase.openDataBase("dataBASE1", 5, true);int recordNumber;String stringSource="ABCDEFGHIJKLMN";int iteration = stringSource.length()-4;for(int i=0;i<iteration;i++) { byte data[] = (stringSource.substring(i,i+5)).getBytes();dataBASE1.insertRecord(data, 0, 5);}databaseState(dataBASE1);dataBASE1.closeDataBase();} catch(Exception e) { }}protected void destroyApp(boolean arg0) { }

record size

새로운 DB 생성

numByteoffset

Page 46: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) OpenDataBase

public void databaseState(DataBase db) {try {

System.out.println("======================================"); System.out.println(""); System.out.println("DataBase Name = “ + db.getDataBaseName() );

int mode; mode=DataBase.getAccessMode(db.getDataBaseName()); if (mode==FileSystem.PRIVATE_ACCESS) {

System.out.println("Access Mode = PRIVATE_ACCESS Mode"); } else if (mode==FileSystem.SHARED_ACCESS) {

System.out.println("Access Mode = SHARED_ACCESS Mode"); } else if (mode==FileSystem.SYSTEM_ACCESS) {

System.out.println("Access Mode = SYSTEM_ACCESS Mode"); }

Page 47: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) OpenDataBase

System.out.println("DataBase Size = "+db.getDataBaseSize() +" Bytes"); System.out.println("Record Number = "+db.getNumberOfRecords() ); System.out.println("Record Size = "+db.getRecordSize()+" Bytes"); System.out.println("Last Modified Time = "+db.getLastModified()); System.out.println("Available Size = " + db.getSizeAvailable()+" Bytes"); System.out.println(""); System.out.println("Records of "+db.getDataBaseName()); for(int index=0;index<db.getNumberOfRecords();index++) { System.out.println("Record "+ index+" : "+new String(db.selectRecord(index))); } System.out.println(""); System.out.println("================================================");

} catch(Exception e){ } }}

Page 48: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) OpenDataBase

데이터베이스 파일

IDX 파일

Page 49: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 삭제 / 수정

레코드 삭제하기 DataBaseName.deleteRecord () 메소드 이용

• public void deleteRecord(int recordId) throws DataBaseException, DataBaseRecordException

– 레코드 ID 를 인수로 받아 해당 레코드를 지움• DataBaseException

– 레코드를 지울 수 없는 경우• DataBaseRecordException

– 인수로 넘긴 레코드 ID 가 없는 경우

Page 50: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 삭제 / 수정

레코드 수정하기 Databasename.updateRecord() 메소드 사용

• public void updateRecord(int recordId, byte[] newData) throws DataBaseException, DataBaseRecordException

– recordID 데이터 내용을 변경할 레코드 ID– newData 새로이 저장할 데이터가 들어 있는 버퍼

• public void updateRecord(int recordId, byte[] newData, int offset, int numBytes) throws DataBaseException, DataBaseRecordException, IllegalArgumentException

– Offset» 쓰기 시작할 데이터의 위치

– numBytes» 쓸 데이터의 길이

Page 51: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 삭제 / 수정

예외 (Exception) 사항• DataBaseException

– 레코드를 저장할 수 없는 경우 발생• DataBaseRecordException

– 새로이 저장할 데이터가 지정한 레코드 크기보다 큰 경우 발생– 레코드 ID 가 존재하지 않을 경우 발생

• IllegalArgumentException– 데이터의 길이 – offset < numBytes 인 경우 발생

Page 52: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) UpdateDataBase

import org.kwis.msp.lcdui.Jlet;import org.kwis.msp.lcdui.Display;import org.kwis.msp.db.DataBase;import org.kwis.msp.db.DataBaseException;import org.kwis.msp.db.DataBaseRecordException;import org.kwis.msp.io.FileSystem;public class UpdateDataBase extends Jlet {

public UpdateDataBase() { }protected void startApp(String[] arg0) {

DataBase dataBASE2 = null;String dataBaseName="dataBASE2";int dbRecordLength=5;try { dataBASE2 = DataBase.openDataBase(dataBaseName, dbRecordLength, true);

String stringSource="WIPIDataBaseEX"; int iteration = stringSource.length()-4; for(int i=0;i<iteration;i++) { byte data[] = (stringSource.substring(i,i+5)).getBytes(); dataBASE2.insertRecord(data,0,5); } databaseState(dataBASE2);1

Page 53: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) UpdateDataBase

String updateSource="AZ";int updateSourceLength=updateSource.length();byte dataUpdate[] = updateSource.getBytes();for(int i=0;i<iteration;i++) { dataBASE2.updateRecord(i,dataUpdate,0,updateSourceLength);}databaseState(dataBASE2);

dataBASE2.deleteRecord(3);dataBASE2.deleteRecord(6);dataBASE2.insertRecord("DELETE".getBytes(),0,5);dataBASE2.insertRecord("DELETE".getBytes(),0,5);dataBASE2.insertRecord("DELETE".getBytes(),0,5);databaseState(dataBASE2);dataBASE2.closeDataBase();

} catch(Exception e) { }}

2

3

0 번째부터 2Byte 를 복사

수정할 데이터가 들어있는 버퍼

Page 54: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) UpdateDataBase

protected void destroyApp(boolean arg0) { }public void databaseState(DataBase db) {

try{ System.out.println("================================");

System.out.println(""); System.out.println("DataBase Name = "+db.getDataBaseName

() ); int mode; mode=DataBase.getAccessMode(db.getDataBaseName());

if(mode==FileSystem.PRIVATE_ACCESS) { System.out.println("Access Mode = PRIVATE_ACCESS Mod

e"); } else if(mode==FileSystem.SHARED_ACCESS) { System.out.println("Access Mode = SHARED_ACCESS Mod

e"); } else if(mode==FileSystem.SYSTEM_ACCESS) {

System.out.println("Access Mode = SYSTEM_ACCESS Mode");

}

Page 55: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) UpdateDataBase

System.out.println("DataBase Size = "+db.getDataBaseSize() +" Bytes"); System.out.println("Record Number = "+db.getNumberOfRecords() ); System.out.println("Record Size = "+db.getRecordSize()+" Bytes"); System.out.println("Last Modified Time = "+db.getLastModified()); System.out.println("Available Size = " + db.getSizeAvailable()+" Bytes"); System.out.println(""); System.out.println("Records of "+db.getDataBaseName()); for(int index=0;index<db.getNumberOfRecords();index++){ try {

System.out.println("Record "+ index+" : "+new String(db.selectRecord(index))); } catch (DataBaseRecordException dbre) { System.out.println("DB Record Exception : " +index);

} } System.out.println(""); System.out.println("===============================================");

} catch(Exception e) {} }}

Page 56: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

12

3

Page 57: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 정렬

레코드 정렬하기 sortRecord() 메소드 사용

• public int[] sortRecord(DataFilter filter, DataComparator comparator) throws DataBaseException

– filter » DataFilter 인터페이스 » 정렬하고자 하는 레코드 선택 (“걸러낸다” )

– Comparator» DataComparator 인터페이스 » 선택한 레코드 정렬할 방법

– 정렬된 순서대로 레코드 ID 를 정수형 배열로 리턴» 정렬된 레코드들의 레코드 ID 반환

예외 (Exception) 사항• DataBaseException

– filter 와 comparator 인수를 가지고 정렬할 수 없는 경우 발생

Page 58: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 정렬

Filter 와 comparator 의 조합• Filter 가 NULL 인 경우

– 데이터 레코드를 걸러내지 않겠다는 의미• Comparator 가 NULL 인 경우

– 정렬할 방법이 없다는 의미 ( 정렬하지 않겠다는 의미 )

• I 의 경우– 원 레코드들의 recordID 만을 반환

• II 의 경우– DB 의 모든 레코드를 선택해서 구현된 정렬방법으로 정렬– 정렬된 레코드들의 recordID 반환

• III 의 경우– Filter 에 구현된 것에 의해 레코드 선택– 정렬하지 않은 레코드들의 recordID 반환

• IV 의 경우– 정렬할 레코드를 선택 (filter) 하고 정렬방법 (comparator) 으로

정렬– 정렬된 레코드들의 recordID 반환

NULL 구현

NULL I II

구현 III IV

ComparatorFilter

Page 59: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 정렬

DataFilter 인터페이스 정렬에 사용할 레코드 선택하는 인터페이스 추상 메소드 filter() 구현

• boolean filter(byte[] data)– 바이트 Array 데이터를 인수로 받음– 해당 레코드가 정렬에 포함 True 값 리턴– 해당 레코드가 정렬에 포함되지 않음 False 값 리턴

기본적인 필터를 위해서는 DataFilter 인터페이스를 구현한 DataFilterInteger 클래스 제공

• DataFilterInteger 생성자 – DataFilterInteger (int offset, int min, int max)

• DataFilterInteger 메소드– boolean filter(byte[] data)

Page 60: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 정렬

DataComparator 인터페이스 두개의 레코드를 비교하는 인터페이스 추상메소드인 compare() 메소드 구현

• public int compare(byte[] data1, byte data2)– 두개의 레코드를 인수로 받음 – 비교방법을 구현하는 것은 개발자 몫– 다음 세값중 하나를 리턴

» EQUIVALENT 두개의 레코드가 순서상 같다» FOLLOWS 첫번째 레코드가 두번째 레코드 다음에 온다» PRECEDES 두번째 레코드가 첫번째 레코드 다음에 온다

Page 61: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 정렬

DataComparatorInteger 클래스• DataComparator 인터페이스를 구현한 클래스• 두 레코드를 정수로 가정하고 두정수 비교• DataComparatorInteger 생성자

– DataComparatorInteger(int offset)» Offset: 레코드에서 비교할 정수가 시작되는 바이트 오프셋» 레코드에서 4byte 를 정수로 보고 비교» 바이트 순서 빅엔디안 (Big-Endian)

• DataComparatorInteger 메소드– Int compare(byte[] data1, byte[] data2)

정수와 문자열등 기본적인 비교를 위해서는 DataComparator 인터페이스를 구현한 DataComparatorInteger 클래스와 DataComparatorString 클래스 제공

리틀 앤디안 (Little Endian) : 가장 낮은 바이트부터 저장하는 방식빅 앤디안 (Big Endian) : 가장 높은 바이트부터 저장하는 방식

Page 62: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

레코드 정렬

DataComparatorString 클래스• DataComparator 인터페이스를 구현한 클래스• 두 레코드를 문자열이라고 가정하고 두 문자열을 비교• DataComparatorString 생성자

– DataComparatorString(int offset)» Offset: 레코드에서 비교할 문자열이 시작되는 바이트 오프셋

• DataComparatorString 메소드– Int compare(byte[] data1, byte[] data2)

Page 63: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) SortDataBase

import org.kwis.msp.lcdui.Jlet;import org.kwis.msp.lcdui.Display;import org.kwis.msp.db.DataBase;import org.kwis.msp.db.DataComparator;import org.kwis.msp.db.DataFilterInteger;import org.kwis.msp.db.DataFilter;import org.kwis.msp.db.DataBaseException;import org.kwis.msp.db.DataBaseRecordException;import org.kwis.msp.io.FileSystem;public class SortDataBase extends Jlet {

public SortDataBase(){ }protected void startApp(String[] arg0) {

DataBase dataBASE3 = null;String dataBaseName="dataBASE3";int dbRecordLength=5;try { dataBASE3 = DataBase.openDataBase(dataBaseName, dbRecordLength, tr

ue); String stringSource="WIPIDataBaseEX"; int iteration = stringSource.length()-4;

Page 64: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) SortDataBase

for(int i=0;i<iteration;i++) { byte data[] = (stringSource.substring(i,i+5)).getBytes();

dataBASE3.insertRecord(data,0,5); } databaseState(dataBASE3); if (dataBASE3.getNumberOfRecords() > 0) { DBRecordCompare DBCompare = new DBRecordCompare();

DBRecordFilter DBFilter = new DBRecordFilter();int index [] = dataBASE3.sortRecord(DBFilter, DBCompare);System.out.println("Sorted Record of "+dataBaseName);System.out.println(" ");

for (int i =0; i<index.length; i++) { String str = new String(dataBASE3.selectRecord(index[i])); System.out.println("Record "+index[i]+" : "+str);}

} dataBASE3.closeDataBase();} catch(Exception e){ }

}protected void destroyApp(boolean arg0) { }

Page 65: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) SortDataBase

public void databaseState(DataBase db){try{ System.out.println("========================================="); System.out.println("");

System.out.println("DataBase Name = "+db.getDataBaseName() ); int mode; mode=DataBase.getAccessMode(db.getDataBaseName()); if(mode==FileSystem.PRIVATE_ACCESS) {

System.out.println("Access Mode = PRIVATE_ACCESS Mode"); } else if(mode==FileSystem.SHARED_ACCESS) {

System.out.println("Access Mode = SHARED_ACCESS Mode"); } else if(mode==FileSystem.SYSTEM_ACCESS) {

System.out.println("Access Mode = SYSTEM_ACCESS Mode"); }

Page 66: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) SortDataBase

System.out.println("DataBase Size = "+db.getDataBaseSize() +" Bytes"); System.out.println("Record Number = "+db.getNumberOfRecords() ); System.out.println("Record Size = "+db.getRecordSize()+" Bytes"); System.out.println("Last Modified Time = "+db.getLastModified()); System.out.println("Available Size = " + db.getSizeAvailable()+" Bytes"); System.out.println(""); System.out.println("Records of "+db.getDataBaseName()); for(int index=0;index<db.getNumberOfRecords();index++){

try{ System.out.println("Record "+ index+" : "+new String(db.selectRecord(index)));

} catch (DataBaseRecordException dbre) { System.out.println("DB Record Exception : " +index);}

} System.out.println(""); System.out.println("===============================================");

} catch(Exception e){}

}

Page 67: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) SortDataBase

class DBRecordCompare implements DataComparator { public int compare(byte[] rec1, byte[] rec2) {

String strREC1 = new String(rec1); String strREC2 = new String(rec2); int cmpValue = strREC1.compareTo(strREC2); if (cmpValue == 0) return DataComparator.EQUIVALENT; else if (cmpValue < 0)

return DataComparator.PRECEDES; else

return DataComparator.FOLLOWS; }

}class DBRecordFilter implements DataFilter { public boolean filter(byte[] rec) {

int i = (int)rec[0]; if((i>=65)&&(i<=90)){return true;} else{return false;}}

}}

//== DataComparator ==/

//== DataFilter ==//

// 레코드의 첫번째 바이트를 정수형으로 바꿈// 65<=i<=90 인 것만 정렬에 참여 (true)// unicode 65 A 90Z

// 두 레코드를 스트링으로 변환

// 두 레코드가 일치

// strREC1 < strREC2

// strREC1 > strREC2

// strREC1 > strREC2

// 오름차순 정렬 (A~Z)

Page 68: WIPI  플랫폼에서의 그래픽 / 데이터 베이스 기능

예제 ) SortDataBase