소프트웨어공학프로젝트 8 조 큐리 119 학 과 컴퓨터과학전공 팀 장 20084334 장용준 팀 원 200914550 서준원 200914626 차진환 201014523 박지혜 201113479 김현수 담당교수 문양세교수님 1
1. 개요 - 계획서 - 1.1 프로젝트개요프로그램명 : 닥터 119 제작배경애완견을키우는사람들이부득이하게병원에가지못할경우에이앱을통해서자가진단을통해상태의심각성을알수있게되고또가까운동물병원으로갈수있는지도와전화번호를제공한다. 그리고애견다이어리기능을통해애견의성장과정과추억들을저장할수있게된다. 1.2 프로젝트의산출물 문서산출물 : 프로젝트계획서, 요구분석서, 설계서 프로그램 : 안드로이드어플리케이션 ( 닥터 119) 1.3 정의, 약어 닥터 119 : 아픈애완견을자가처방할수있고애견정보가담겨있는어플리케이션 DB : DataBase 의약어, 정보저장프로그램 2. 자원및일정예측 2.1 자원조직구성및인력배치분산형팀조직-민주주의식의사결정서준원 : 설계서작성, 디자인장용준 : 계획서작성, 자료수집차진환 : 설계서작성, 자료수집김현수 : 요구분석서작성, 프로그래밍박지혜 : 발표자료작성, 발표 2
2.2 일정예측 계획 요구분석 설계 구현테스트 진행목차 10.11~15 10.16~20 10.21~25 10.26~11.20 11.20~30 프로젝트기획 자원및일정 조직구성및 인력배치표준및절차계획구체화작업성능및 제약조건고려 DB 설계 Class 설계 App 구현 App 테스트 3. WBS 4. 기술관리방법 4.1 변경관리변경요구사항수집후회의때변경주기적인프로젝트점검 4.2 위험관리일정지연을예방하기위해서철저하게일정을관리한다. 명확하게설계한다. 정확하게요구분석한다. 예상치못한상황에대한대비로백업을해둔다. 3
4.3 문제점해결방안 문제가발생하면인터넷이나책을통해해결한다. 문제발생이전에문제를예측하여문제를예방한다. 5. 표준및개발절차 5.1 개발방법론 폭포수모형 계획 1) 프로그램작성이전에안드로이드프로그래밍원리및지식습득 2) 프로그램설계 3) 프로그램구현 4) 테스트및디버깅 6. 검토회의 6.1 검토회일정 10월 11일 : 1차검토회 10월 16일 : 2차검토회 10월 21일 : 3차검토회 10월 25일 : 4차검토회 11월 5일 : 5차검토회 11월 25일 : 6차검토회 6.2 검토회진행방법 회의순서 1) 팀장의일정브리핑 4
2) 주요사항논의 3) 문제점논의 4) 건의사항 6.3 검토회후속조치 회의종료후문제점이나변동사항이있으면신속하게전파한다. 회의로결정된사항들을잘지킨다. 7. 개발환경개발운영체제 : Windows 7(32bit) 개발도구 : Eclipse, Android DataBase : SQL lite 8. 성능시험방법프로그램의안정성과정확도를시험한다. 여러운영체제에서시험해본다. 스마트폰에서시험해보고오류를다시해결한다. 9. 문서화 일단개인이작성하고다시모여서수정한다. 계속해서정보를교환하며의사소통을한다. 10. 유지보수유지보수영역 : 안드로이드어플리케이션유지보수주기 : 정기정검 1년, 긴급정검 ( 새로운질병이발생하였을때 ) 유지보수요구수집 : 유지보수요구는메일로받는다. 11. 설치, 인수프로그램개발이완료되면, 인수하여테스트한다. 테스트한결과를문서화한다. 테스트완료후이상없으면프로그램을설치한다. 프로그램을설치하여이상이있는지최종적으로정검한다. 12. 참고문헌및부록소프트웨어공학 문양세교수님 PPT 자료 5
- 요구분석서 - 1. 개요 1.1 개발주제 애견 ( 강아지 ) 관리앱 1.2 시스템의목적사회가발전할수록점점애완동물을키우는가정이늘고있다. 애견을관리하는일은많은시간과돈을요하는일이나, 바쁜현대사회에살며애견에만신경을쓰고있을수는없는노릇이다. 이앱을개발하는목적은애견인들에게보다많은정보를제공하고, 편리하고효율적으로, 많은시간을투자하지않고도이앱을통해정보를얻어애견을관리할수있도록편의사항들을제공해주는것이다. 또한애견다이어리기능을추가하여보다섬세하게애견을돌볼수있도록돕는다. 1.3 개발배경애견이가벼운병에걸렸을때, 병원에가기에는병원비가너무비쌈. 바쁜현대사회에서애견에많은시간을투자하지못할때가많음. 애견에대한정보를한번에얻을수있는앱이많지않음. 애견인들에게정보외에부차적인필요도있을텐데그필요들을채우려함. 1.4 개발환경 OS : Android DBMS : SQL Lite Document : Microsoft Office Power Point, 한글. etc. : Photoshop, Eclipse. 1.5 시나리오애견이병에걸렸거나문제가있을때, 병원에가지않고, 여러정보를찾기위해전문도서와웹서핑에시간을낭비하지않고앱하나로간단하게정보를얻을수있게한다. 많은시간을들이지않고도애견을손쉽게관리할수있도록돕는다. 1.6 시스템필수요소신속한정보획득 : 대분류, 소분류방식을이용하여애견의상황에따라손쉽게정보를획득할수있도록함. 동물병원위치검색 : 이앱만으로해결이안될상황에는동물병원에가야하므로주변에동물병원이어디있는지확인하고정보제공. 애견다이어리 : 애견에대한여러가지정보를제공하는다이어리기능. 6
2. 기능적요구 2.1 외부인터페이스요구사용자인터페이스 : 사용자가사용하기편하게그림을이용해서정리할예정. 그림으로대분류를나눈후소분류목록을주어세세한병명을검색하게함. 2.2 기능요구사용사례 1 : 애견이아픈데어디가아픈지모르는상황에서초기진단이필요할때이앱을통해임시진료. 사용사례 2 : 임시진료가끝난후병원이필요할때병원의위치를조사해정보를받고, 받은정보를찾음.( 정보에는위치, 전화번호등인터넷에서제공해주는정보가들어감.) 2.3 자료흐름도 3. 기타요구및제약사항가. 성능요구정확한정보를제공한다. 깔끔한인터페이스제공 3.1 H/W 요구 DB 와연동할수있는서버 안드로이드를프로그래밍할수있는하드웨어체제구축 3.2 사용자인터페이스 간단한인터페이스구성으로초보자도쉽게사용할수있게구현 7
- 설계서 - 1. 개요 1.1 시스템의목표애완견의증상을확인하고그에따른병명, 치료방법, 예방법등을제공애완견의상태를매일기록할수있는애견다이어리기능지도뷰를통한근처동물병원의위치, 전화번호제공 1.2 하드웨어 Intel Core(TM)2 CPU E8400 @ 3.00GHz 1.3 소프트웨어개발운영체제 : Windows 7(32bit) 개발도구 : Eclipse, Android DataBase : SQL lite 2. 시스템구조 2.1 시스템구조개요 2.2 시스템구조도 3. 모듈설계 모듈명 Curi 119 모듈형 Output image 인터페이스 Image View 오류메시지 x 사용하는파일 Main_image.jpg 호출하는모듈 x 기능설명 메인화면이다. 모듈명모듈형인터페이스오류메시지사용하는파일호출하는모듈기능설명 My Pet Input Text EditText 알수없는강아지정보입니다. x x 내강아지의품종, 나이, 성별을입력시키는창이다. 8
모듈명 My address 모듈형 Input Text 인터페이스 EditText 오류메시지 알수없는주소입니다. 사용하는파일 x 호출하는모듈 x 기능설명 내거주지를입력시키는창이다. 모듈명 Where? 모듈형 Output Graphic 인터페이스 View 모듈명모듈형인터페이스오류메시지사용하는파일호출하는모듈기능설명모듈명모듈형인터페이스 Why? Output Text TextView DB 오류 x x 내강아지정확한증상을알수있게선택지를주며대분류에서소분류로데이터를출력한다. Pet diary Input Text EditText 오류메시지 x 오류메시지 x 사용하는파일호출하는모듈기능설명 My_map.png x 근처동물병원위치를출력한다. 사용하는파일호출하는모듈기능설명 x x 강아지관련일기를작성하는곳이다. 모듈명모듈형인터페이스오류메시지사용하는파일호출하는모듈기능설명 Call Output Label Label DB 읽기실패 x x 동물병원전화번호를출력함. 4. 제약사항 1. 강아지의모든병명에대해서정확하게사용자에게정보를전달해주기는어렵다.(DB 가매우방대하다 ) 2. 새로운병이나타날때마다입력을시켜줘야하므로잦은업데이트가요구된다. 3. 애완동물전문가가아니기때문에정확한진단을하기는어렵다. 언제까지나인터넷정보에의존하는정보일수밖에없다. 4. 애완동물병원의위치에오차가있을수있다. 5. 팀원모두아직안드로이드에익숙하지가않다. 5. 참고사항 소프트웨어공학 문양세교수님 PPT 자료 동물관련의학서적 9
- 시험결과 - 메인화면메뉴선택애견진단 다이어리날짜선택병원찾기 10
- 코드 - *Main menu* package puppy.clinic; import android.app.activity; import android.content.intent; import android.os.bundle; import android.view.view; import android.widget.button; public class MainMenu extends Activity { /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.menu); Button button = (Button)findViewById(R.id.gotoPC); button.setonclicklistener(new Button.OnClickListener() { public void onclick(view v) { Intent intent = new Intent(MainMenu.this, MainList.class); ); Button button2 = (Button)findViewById(R.id.gotoD); button2.setonclicklistener(new Button.OnClickListener() { public void onclick(view v) { Intent intent = new Intent(MainMenu.this, CalendarActivity.class); ); Button button3 = (Button)findViewById(R.id.gotoLO); button3.setonclicklistener(new Button.OnClickListener() { public void onclick(view v) { Intent intent = new Intent(MainMenu.this, Map.class); ); 11
*Map* package puppy.clinic; import java.util.list; import android.graphics.canvas; import android.graphics.drawable.drawable; import android.os.bundle; import android.widget.toast; import com.google.android.maps.geopoint; import com.google.android.maps.itemizedoverlay; import com.google.android.maps.mapactivity; import com.google.android.maps.mapcontroller; import com.google.android.maps.mapview; import com.google.android.maps.overlay; import com.google.android.maps.overlayitem; public class Map extends MapActivity{ MapView mmap; Drawable mmarker; //------ protected boolean isroutedisplayed(){ return false; public void oncreate(bundle savedinstancestate){ super.oncreate(savedinstancestate); setcontentview(r.layout.map); mmap = (MapView)findViewById(R.id.mapView1); MapController mapcontrol = mmap.getcontroller(); mapcontrol.setzoom(15); mmap.setsatellite(false); mmap.setbuiltinzoomcontrols(true); GeoPoint pt = new GeoPoint((int)(37.869789*1000000.0), 12
(int)(127.743380*1000000.0)); mapcontrol.setcenter(pt); mmarker.getintrinsicheight()); mmarker = getresources().getdrawable(r.drawable.marker); mmarker.setbounds(0, 0, mmarker.getintrinsicwidth(), Clinic rest = new Clinic(mMarker); List<Overlay> overlays = mmap.getoverlays(); overlays.add(rest); class Clinic extends ItemizedOverlay<OverlayItem>{ public Clinic(Drawable marker){ super(marker); boundcenterbottom(marker); boundcenter(mmarker); populate(); public void draw(canvas canvas, MapView mapview, boolean shadow){ super.draw(canvas, mapview, false); public int size(){ return 11; protected OverlayItem createitem(int i){ OverlayItem item = null; switch(i){ case 0: item = new OverlayItem(new GeoPoint((int)(37.868252*1000000.0), (int)(127.751175*1000000.0)), " 강원대학교부속동물병 원 ", "033-250-8606"); case 1: item = new OverlayItem(new GeoPoint((int)(37.877817*1000000.0), (int)(127.750794*1000000.0)), " 춘천 동물병원 ", "033-242-1317"); 13
case 2: item = new OverlayItem(new GeoPoint((int)(37.862909*1000000.0), (int)(127.749976*1000000.0)), " 강남종합동물병원 ", "033-263-0513"); case 3: item = new OverlayItem(new GeoPoint((int)(37.859684*1000000.0), (int)(127.742943*1000000.0)), " 미래종합동물병원 ", "033-275-7533"); case 4: item = new OverlayItem(new GeoPoint((int)(37.856347*1000000.0), (int)(127.743112*1000000.0)), " 봄내 동물병원 ", "033-262-9070"); case 5: item = new OverlayItem(new GeoPoint((int)(37.879968*1000000.0), (int)(127.742913*1000000.0)), " 현대 동물병원 ", "033-256-7582"); case 6: item = new OverlayItem(new GeoPoint((int)(37.855324*1000000.0), (int)(127.751649*1000000.0)), " 우리 동물병원 ", "033-263-7502"); case 7: item = new OverlayItem(new GeoPoint((int)(37.851353*1000000.0), (int)(127.743533*1000000.0)), " 고려 동물병원 ", "033-264-9975"); case 8: item = new OverlayItem(new GeoPoint((int)(37.885835*1000000.0), (int)(127.745740*1000000.0)), " 한독 동물병원 ", "033-275-7533"); case 9: item = new OverlayItem(new GeoPoint((int)(37.881766*1000000.0), (int)(127.747983*1000000.0)), " 삼성 동물병원 ", "033-244-9975"); case 10: item = new OverlayItem(new 14
GeoPoint((int)(37.867273*1000000.0), (int)(127.731999*1000000.0)), " 조 동물병원 ", "033-251-0911"); item.setmarker(mmarker); return item; public boolean ontap(int index){ String msg; OverlayItem item = getitem(index); msg = " 이름 : " + item.gettitle() + "\n"+" 전화번호 : " + item.getsnippet(); Toast.makeText(Map.this, msg, Toast.LENGTH_LONG).show(); return true; *Mainlist* package puppy.clinic; import java.util.arraylist; import android.app.activity; import android.content.intent; import android.os.bundle; import android.view.view; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.listview; public class MainList extends Activity { /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.list); ArrayList<String> list = new ArrayList<String>(); list.add(" 구토증상이있다."); list.add(" 걸음걸이에이상이있다."); 15
list.add(" 기침을한다."); list.add(" 호흡곤란이있다."); list.add(" 기운이없다."); list.add(" 설사증상이있다."); list.add(" 식욕부진이있다."); list.add(" 가려움증이있다."); list.add(" 콧물이난다."); list.add(" 탈모현상이있다."); list.add(" 열이난다."); list.add(" 귀지가부풀어오른다 "); list.add(" 눈을자주비비고눈물을많이흘린다."); list.add(" 눈주위가짓무르고지저분하다."); list.add(" 눈이녹색이거나적색으로보인다."); list.add(" 안구가커진다."); list.add(" 코에서피가난다."); list.add(" 이가노란색이거나갈색으로변색된다."); list.add(" 잇몸이붓고피가난다."); list.add(" 호흡곤란과황달이생긴다."); list.add(" 조금씩여위어간다."); list.add(" 호흡곤란이있고제대로성장하지못한다."); list.add(" 배가부풀어오르고침을흘린다."); list.add(" 입안에발진이생기며붓거나짓무른다."); list.add(" 침을많이흘리거나입냄새가난다."); list.add(" 입주위를핥다가털이빠지거나악취가난다."); list); ArrayAdapter<String> adapter; adapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, ListView listview = (ListView)findViewById(R.id.list); listview.setadapter(adapter); listview.setchoicemode(listview.choice_mode_single); listview.setonitemclicklistener(mitemclicklistener); AdapterView.OnItemClickListener mitemclicklistener = new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> parent, View view, int position, long id) { Intent intent = null; switch(position) { case 0: 16
startactivity(new Intent(MainList.this, vomit.class)); case 1: startactivity(new Intent(MainList.this, walking.class)); case 2: startactivity(new Intent(MainList.this, cough.class)); case 3: startactivity(new Intent(MainList.this, breathing.class)); case 4: startactivity(new Intent(MainList.this, energy.class)); case 5: startactivity(new Intent(MainList.this, diarrhea.class)); case 6: startactivity(new Intent(MainList.this, appetite.class)); case 7: startactivity(new Intent(MainList.this, itching.class)); case 8: startactivity(new Intent(MainList.this, running.class)); case 9: startactivity(new Intent(MainList.this, hair.class)); case 10: startactivity(new Intent(MainList.this, fever.class)); case 11: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 이혈종 "); case 12: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 각막염 결막염 "); case 13: 17
intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 각막염 결막염 "); case 14: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 녹내장 "); case 15: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 녹내장 "); case 16: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 비출혈 "); case 17: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 치주병 "); case 18: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 치주병 "); case 19: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 필라리아증 "); case 20: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 간경변 "); case 21: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 심실중격결손증 "); 18
case 22: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 위염전 "); case 23: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 구내염 구순염 "); case 24: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 구내염 구순염 "); case 25: intent = new Intent(MainList.this, Result.class); intent.putextra("put"," 구내염 구순염 "); ; *CalendarActivity* package puppy.clinic; import java.util.date; import java.util.arraylist; import java.util.calendar; import android.app.activity; import android.content.intent; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.adapterview; import android.widget.adapterview.onitemclicklistener; import android.widget.arrayadapter; import android.widget.button; import android.widget.gridview; import android.widget.textview; 19
public class CalendarActivity extends Activity implements OnClickListener,OnItemClickListener { ArrayList<String> mitems; ArrayAdapter<String> adapter; TextView textyear; TextView textmon; /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.calendar_main); textyear = (TextView) this.findviewbyid(r.id.edit1); textmon = (TextView) this.findviewbyid(r.id.edit2); mitems = new ArrayList<String>(); adapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, mitems); GridView gird = (GridView) this.findviewbyid(r.id.grid1); gird.setadapter(adapter); gird.setonitemclicklistener(this); // Date date = new Date(0, 0, 0);// 오늘에날짜를세팅해준다. Calendar car = Calendar.getInstance( ) ; Date date = car.gettime() ; int year = date.getyear() + 1900; int mon = date.getmonth() + 1; textyear.settext(year + ""); textmon.settext(mon + ""); filldate(year, mon); Button btnmove = (Button) this.findviewbyid(r.id.bt1); btnmove.setonclicklistener(this); public void onclick(view arg0) { // TODO Auto-generated method stub if (arg0.getid() == R.id.bt1) { 20
int year = Integer.parseInt(textYear.getText().toString()); int mon = Integer.parseInt(textMon.getText().toString()); filldate(year, mon); private void filldate(int year, int mon) { mitems.clear(); mitems.add(" 일 "); mitems.add(" 월 "); mitems.add(" 화 "); mitems.add(" 수 "); mitems.add(" 목 "); mitems.add(" 금 "); mitems.add(" 토 "); Date current = new Date(year - 1900, mon - 1, 1); int day = current.getday(); // 요일도 int 로저장. for (int i = 0; i < day; i++) { mitems.add(""); current.setdate(32);// 32 일까지입력하면 1 일로바꿔준다. int last = 32 - current.getdate(); for (int i = 1; i <= last; i++) { mitems.add(i + ""); adapter.notifydatasetchanged(); 때 public void onitemclick(adapterview<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub if (mitems.get(arg2).equals("")) { ; else { Intent intent = new Intent(this, Today.class);// 해당일을눌렸을 intent.putextra("param1", textyear.gettext().tostring() + "/" 21
mitems.get(arg2)); *Result* package puppy.clinic; + textmon.gettext().tostring() + "/" + import java.util.arraylist; import android.app.expandablelistactivity; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.os.bundle; import android.util.log; import android.view.gravity; import android.view.view; import android.view.viewgroup; import android.widget.abslistview; import android.widget.baseexpandablelistadapter; import android.widget.expandablelistadapter; import android.widget.textview; public class Result extends ExpandableListActivity { private static final String TAG = "Result"; ExpandableListAdapter madapter; private String get = null; public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.last); get = getintent().getextras().getstring("put"); Log.e(TAG,"get : " + get); madapter = new MyExpandableListAdapter(get); setlistadapter(madapter); 22
registerforcontextmenu(getexpandablelistview()); TextView tv = (TextView)findViewById(R.id.tvLast); tv.settext(get); tv.settextsize(30); public class MyExpandableListAdapter extends BaseExpandableListAdapter { ClinicDataHelper openhelper = null; SQLiteDatabase sdb = null; String get = null; int height = 0; ArrayList<Disease> diseases = null; private String[] groups = { " 원인과증상 ", " 치료와예방법 " ; private String[][] children = null; public MyExpandableListAdapter(String get) { this.get = get; this.openhelper = new ClinicDataHelper(getApplicationContext()); this.sdb = openhelper.getreadabledatabase(); this.diseases = new ArrayList<Disease>(); getdisease(); setchildren(); private void setchildren() { children = new String[][] { {"abc", {"abc" ; children[0][0] = diseases.get(0).getsymptom(); children[1][0] = diseases.get(0).gettreat(); private void getdisease() { String sql = "select * from " + Constants.ClinicData.TABLE_NAME + " where " + Constants.ClinicData.NAME + " = '" + this.get + "'"; Cursor c = sdb.rawquery(sql, null); String name = new String(); String symptom = new String(); String treat = new String(); 23
if(c.movetofirst()) { treat); do { name = c.getstring(0); symptom = c.getstring(1); treat = c.getstring(2); Disease temp = new Disease(name, symptom, diseases.add(temp); while(c.movetonext()); this.height = symptom.length(); public Object getchild(int groupposition, int childposition) { return children[groupposition][childposition]; public long getchildid(int groupposition, int childposition) { return childposition; public int getchildrencount(int groupposition) { return children[groupposition].length; public TextView getgenericview() { AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 64); TextView textview = new TextView(Result.this); textview.setlayoutparams(lp); textview.setgravity(gravity.center_vertical Gravity.LEFT); textview.setpadding(30, 10, 30, 10); return textview; public View getchildview(int groupposition, int childposition, boolean islastchild, View convertview, ViewGroup parent) { TextView textview = getgenericview(); AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, height + 40); 24
textview.setlayoutparams(lp); textview.setpadding(10, 10, 10, 10); textview.settext(getchild(groupposition, childposition).tostring()); return textview; public Object getgroup(int groupposition) { return groups[groupposition]; public int getgroupcount() { return groups.length; public long getgroupid(int groupposition) { return groupposition; public View getgroupview(int groupposition, boolean isexpanded, View convertview, ViewGroup parent) { TextView textview = getgenericview(); textview.settext(getgroup(groupposition).tostring()); return textview; public boolean ischildselectable(int groupposition, int childposition) { return true; public boolean hasstableids() { return true; *MydbHelper* package puppy.clinic; import android.content.context; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqlitedatabase.cursorfactory; import android.database.sqlite.sqliteopenhelper; 25
public class MyDBHelper extends SQLiteOpenHelper { // 데이터베이스클래스 public MyDBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub @Override public void oncreate(sqlitedatabase db) { // TODO Auto-generated method stub db.execsql("create TABLE today(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, " + "date TEXT, " + "time TEXT, " + "memo TEXT );"); @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { // TODO Auto-generated method stub db.execsql("drop TABLE IF EXIST today;"); oncreate(db); *Detail* package puppy.clinic; import android.app.activity; import android.content.intent; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.edittext; public class Detail extends Activity implements OnClickListener { // 일정목록추가하기 MyDBHelper mdbhelper; int mid; 26
String today; EditText editdate, edittitle, edittime, editmemo; /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.detail); editdate = (EditText) findviewbyid(r.id.editdate); edittitle = (EditText) findviewbyid(r.id.edittitle); edittime = (EditText) findviewbyid(r.id.edittime); editmemo = (EditText) findviewbyid(r.id.editmemo); Intent intent = getintent(); mid = intent.getintextra("paramid", -1); today = intent.getstringextra("paramdate"); mdbhelper = new MyDBHelper(this, "Today.db", null, 1); if (mid == -1) { editdate.settext(today); else { SQLiteDatabase db = mdbhelper.getwritabledatabase(); Cursor cursor = db.rawquery("select * FROM today WHERE _id='" + mid+ "'", null); if (cursor.movetonext()) { edittitle.settext(cursor.getstring(1)); editdate.settext(cursor.getstring(2)); edittime.settext(cursor.getstring(3)); editmemo.settext(cursor.getstring(4)); mdbhelper.close(); Button btn1 = (Button) findviewbyid(r.id.btnsave); btn1.setonclicklistener(this); Button btn2 = (Button) findviewbyid(r.id.btndel); btn2.setonclicklistener(this); Button btn3 = (Button) findviewbyid(r.id.btncancel); btn3.setonclicklistener(this); 27
if (mid == -1) { btn2.setvisibility(view.invisible); public void onclick(view v) { // TODO Auto-generated method stub SQLiteDatabase db = mdbhelper.getwritabledatabase(); switch (v.getid()) { case R.id.btnsave: if (mid!= -1) { db.execsql("update today SET title='" + edittitle.gettext().tostring() + "',date='" + editdate.gettext().tostring() + "', time='" + edittime.gettext().tostring() + "', memo='" + editmemo.gettext().tostring() + "' WHERE _id='" + mid + "';"); else { db.execsql("insert INTO today VALUES(null, '" + edittitle.gettext().tostring() + "', '" + editdate.gettext().tostring() + "', '" + edittime.gettext().tostring() + "', '" + editmemo.gettext().tostring() + "');"); mdbhelper.close(); setresult(result_ok); case R.id.btndel: if (mid!= -1) { db.execsql("delete FROM today WHERE _id='" + mid + "';"); mdbhelper.close(); setresult(result_ok); case R.id.btncancel: setresult(result_canceled); 28
finish(); *ClinicDataHelper* package puppy.clinic; import puppy.clinic.constants.clinicdata; import android.content.context; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteopenhelper; import android.util.log; public class ClinicDataHelper extends SQLiteOpenHelper { static final String TAG = "ClinicDataHelper"; public ClinicDataHelper(Context c) { super(c, ClinicData.DB_NAME, null, ClinicData.DB_VERSION); public void oncreate(sqlitedatabase db) { db.execsql("create TABLE " + ClinicData.TABLE_NAME + " (" + ClinicData.NAME + " text, " + ClinicData.SYMPTOM + " text," + ClinicData.TREAT + " text);"); public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { Log.w(TAG, "Version mismatch :" + oldversion + "to " + newversion); db.execsql("drop TABLE " + ClinicData.TABLE_NAME); oncreate(db); 29