680 likes | 967 Views
WIPI 플랫폼에서의 그래픽 / 데이터 베이스 기능. 2004. 9. 그래픽 (Graphics) 패키지 : org.kwis.msp.lcd. 그래픽 패키지의 클래스 상속도. Object. JletEventListener. InputMethodListner. ImageObserver. Jlet. Card. Display. Font. Graphics. Image. EventQueue. InputMethodListener. 그래픽 (Graphics) 패키지. Graphics 클래스
E N D
WIPI 플랫폼에서의 그래픽/데이터 베이스 기능 2004. 9.
그래픽(Graphics) 패키지: org.kwis.msp.lcd • 그래픽 패키지의 클래스 상속도 Object JletEventListener InputMethodListner ImageObserver Jlet Card Display Font Graphics Image EventQueue InputMethodListener
그래픽(Graphics) 패키지 • Graphics 클래스 • 2차원 기하학적 도형을 그리는 기능 제공 • 원점 (0,0): 좌측 상단 • Translate 함수에 의해 변경 가능 Graphics 클래스에서 좌표체계
그래픽(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
그래픽(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); } }
그래픽(Graphics) 패키지 예제1 • Card : 그림을 그리기위한 도화지 • Graphics 클래스: 그림을 그리기 위한 도구 • 화면의 크기 • 넓이 : getWidth(), 높이: getHeight fillRect(x, y, width, height) fillRoundRect(x, y, width, height, arcwidth, archeight) fillArc(x, y, width, height, startAngle, arcAngle)
선(Stroke) 그리기 class SampleCard extends Card { public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Default SOLID g.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); } }
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; } };
투명도(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 Transparency Alpha 255 Opaque
클리핑 (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
클리핑 (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) {}
클리핑 (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; }
클리핑 (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; } };
이미지 클래스와 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)
이미지 클래스와 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(……); 변경 가능
이미지 클래스와 imageObserver 인터페이스 • Image 클래스 • 애니메이션 이미지 • 복사할 수 없음 (변경이 불가능) • play(imageObserver io) animated gif 수행 • stop() 실행 중지 • stopImage(ImageObserver io) 로딩 중지 • 애니메이션 이미지와 이미지 변환가능성 확인 여부 • Boolean isAnimate() 애니메이션 이미지인가? • Boolean isMutable() 변경이 가능한가?
이미지 클래스와 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: 디코딩 결과 오류
ImageTest 예제 class SampleCard extends Cardimplements ImageObserver { Image img = null; Image copy = null; int notifyCounter = 0; public SampleCard() { try { img = Image.createImage("ani.gif"); copy = Image.createImage(Image.createImage("copy.gif")); } catch (Exception e) { } }
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(); } };
문자열 출력과 앵커의 활용 • 문자열 출력 함수 • 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) • 이미지나 폰트 등을 출력할 때 위치를 결정하는 함수
문자열 출력과 앵커의 활용 • 앵커 • 수직과 수평을 OR를 이용하여 동시에 사용가능 Ex) TOP | LEFT • LEFT, HCENTER, RIGHT 위치 • TOP, BASELINE, BOTTOM 위치
예제) 수평 스타일로 문자열 출력 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); } };
예제) 수직 스타일로 문자열 출력 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); } };
폰트 활용 • 폰트 함수 • 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 인수값이외의 값들이 입력될 경우 발생
예제) 폰트 활용 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 };
예제) 폰트 활용 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; } } };
이벤트(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 등으로 카드를 보여지거나 감춰지거나 할때 발생하는 이벤트 함수
이벤트(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 등등
예제) 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); }
예제) 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; } }; 제어키 처리 일반키 처리
데이터베이스(Database 패키지): org.kwis.msp.db • 데이터베이스 패키지 • 핸드폰에 내장되어 있는 플래시 메모리에 데이터베이스 구성 • 데이터 베이스 생성, 필요한 데이터 삽입, 삭제, 수정 Object Interface DataComparator DataFilter DataBaseRecordException Exception DataBaseException DataBase DataComparatorInteger DataComparoatorString DataFilterInteger
데이터 베이스 • 데이터베이스 • 다양한 데이터들의 집합체 • 체계화된 데이터 • 데이터베이스 관리시스템(DBMS) • 데이터베이스를 생성, 관리 • 사용자가 원하는 정보 추출 • 데이터베이스 관리언어(Database Management Language) • DBMS가 데이터베이스르 관리할 때 쓰이는 명령 체계 • SQL(Structured Query Language) • 데이터베이스에서 정보를 얻거나 갱신하기 위한 표준화된 언어 • Ex) Select, Insert, Update, Delete
데이터베이스 클래스 • 데이터베이스 클래스 • 플래시메모리에 데이터베이스를 생성하고, 생성된 데이터베이스를 관리하는 DBMS의 역할 • 특징 • 여러 개의 레코드로 구성 • 각 레코드는 오직 한 개의 필드만을 가질 수 있음 • 일반 DBMS에 제공하는 DBL은 제공하지 않음 • 데이터베이스 정렬을 위해 DataFIlter와 DataComparator 인터페이스 제공 • DataFilter 레코드를 골라내는 역할 • DataComparator 레코드 두개를 비교하는 역할 • 풀랫폼이 다운되더라도 이미 저장된 레코드라면 무결성 보장 • 레코드는 바이트 Array단위로 저장 • 데이터의 의미는 무시, 논리적의미를 파악하는것은 사용자 몫
데이터베이스 클래스 • 레코드의 크기는 처음 해당 데이터베이스를 생성할 때 지정한 크기를 초과할 수 없음 • 레코드는 데이터베이스 상에서 레코드 ID라는 정수값으로 표현 • 레코드 ID : 0부터 시작 • 레코드 하나를 저장할때마다 1증가 • 중간에 레코드가 삭제되면 다음 레코드를 저장할 때 삭제된 레코드 ID를 재사용 • 데이터베이스 생성 모드 • PRIVATE • 이 DB를 생성한 Jlet은 접근 가능, 다른 Jlet은 이 DB 접근 불가능 • SHARED • 공유디렉토리에 저장, 여러 Jlet이 공유 • SYSTEM • 시스템 어플리케이션이 사용하는 디렉토리에 저장 • Jlet이 플랫폼상에서 지워지면 DB도 삭제됨
데이터베이스 생성/삭제/닫기 • 데이터베이스 생성 • 보통 클래스 • 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) 메소드 이름이 같더라도 인수의 자료형과 개수가 다르면 서로 다른 메소드로 인식
데이터베이스 생성/삭제/닫기 • 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 생성
데이터베이스 생성/삭제/닫기 • 예외(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폴더
데이터베이스 생성/삭제/닫기 • 데이터베이스 삭제하기 • 두가지 오버로딩 사용 • public static void deleteDataBase(String dbName) throws DataBaseException • DB 접근모드가 FileSystem.PRIVATE_ACCESS인 DB 삭제 • public static void deleteDataBase(String dbName, int flag) throws DataBaseException • 지정모드의 DB만을 삭제 • DataBaseException 오류 • 삭제할 DB가 없거나 지우지 못할 경우에 발생
데이터베이스 생성/삭제/닫기 • 데이터베이스 닫기 • Public void closeDataBase() throws DataBaseException • DB를 닫을 때 사용 • DataBaseException 오류 • idx 파일에 DB 관리정보 저장 • 관리정보를 저장할 수 없을 때 발생 • db 파일을 닫을 수 없을 때 발생
레코드 삽입/선택 • 레코드 삽입하기 • 하나의 레코드로 데이터베이스에 저장 • 저장할 바이트 길이가 지정한 레코드 크기보다 작으면 남은 영역에 쓰레기(Garbage) 값이 저장 • 바이트 Array의 실제 데이터와 쓰레기 값의 구별은 사용자 몫 • DataBase Name.insertRecord() 메소드 사용
레코드 삽입/선택 • 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 인수: 저장할 바이트 수 예) 크기가 10인 바이트 버퍼에 3~5번째까지를 레코드에 삽입 offset 2 , numBytes 3
레코드 삽입/선택 • 예외(Exception) 사항 • DataBaseRecordException • 지정한 레코드 크기보다 삽입할 데이터가 큰경우 발생 • DataBaseException • 레코드를 저장할 수 없는 경우 발생 • IllegalArgumentException • 바이트 버퍼의 길이 – offset < numBytes 인 경우 발생 • Ex) offset 7, numBytes 5 인경우 10 - 7 < 5
레코드 삽입/선택 • 레코드 선택하기 • selectRecord() 메소드 사용 • public byte[] selectRecord(int recordId) throws DataBaseException, DataBaseRecordException • 레코드 ID에 저장된 데이터를 바이트 array로 리턴 • public void selectRecord(int recordId, byte[] buffer, int offset) throws DataBaseException, DataBaseRecordException, IllegalArgumentException • 읽어들인 데이터를 복사해서 인수로 준 Buffer에 복사해주는 방식 • 버퍼의 내용을 바꾸더라도 DB에 저장된 레코드는 변하지 않음 • Buffer • 읽어들인 데이터를 복사하여 저장할 버퍼 • offset • 인수로 준 버퍼에서 복사를 시작할 첫 번째 바이트 오프셋
레코드 삽입/선택 • 예외(Exception) 사항 • DataBaseException • 레코드를 읽을 수 없을 경우 발생 • DataBaseRecordException • 레코드 ID가 존재하지 않을 경우 발생 • IllegalArgumentException • 버퍼가 레코드 크기보다 작은 경우 발생
예제) 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 생성 numByte offset
예제) 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"); }
예제) 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){ } } }
예제) OpenDataBase IDX 파일 데이터베이스 파일
레코드 삭제/수정 • 레코드 삭제하기 • DataBaseName.deleteRecord () 메소드 이용 • public void deleteRecord(int recordId) throws DataBaseException, DataBaseRecordException • 레코드 ID를 인수로 받아 해당 레코드를 지움 • DataBaseException • 레코드를 지울 수 없는 경우 • DataBaseRecordException • 인수로 넘긴 레코드 ID가 없는 경우
레코드 삭제/수정 • 레코드 수정하기 • 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 • 쓸 데이터의 길이