sqlite 시간표 예외처리 질문드립니다. 0 6 611

by 카이 [SQL Query] [2019.01.16 14:16:29]


2.JPG (77,192Bytes)
3.JPG (87,627Bytes)

 안드로이드 시간표 어플리케이션을 만들어보고 있는데요. 다른 부분은 어느정도 예제 참고하고 문법 공부하고 하다보니 구현하였는데, 수업 예외처리 하는 부분이 너무 어려워서 질문드리게 되었습니다. 인터넷에 보니까 sql문에 A.종료일자 >= B.시작일자 AND A.시작일자 <= B.종료일자 공식을 사용해도 된다고 하던데 sqlite에도 사용 가능한건지 아닌지도 잘 모르겠습니다.

 일단 도움받고 싶은 것은 수업시간대가 겹치지 않게 하는 것입니다. 밑의 데이터가 있다고 가정할 때

---------------------------------------------------------------------------------------------------------------

_id    subjectname         week    starttime    endtime    studyroom    professor    color    memo

1      데이터베이스        목요일   9:00          11:00             

2      소프트웨어공학     화요일   13:00         15:00

3      리눅스                 수요일   11:00        13:00

4      컴퓨터프로그래밍  월요일    15:00        17:00

-------------------------------------------------------------------------------------------------------------

       운영체제              화요일   14:00         16:00   값을 집어 넣을 때 시간이 겹쳐서 이 시간대에 수업이 있다는 오류를 출력하고 데이터를 넣지 않는 예외처리를 구현해보고 싶습니다. 제가 생각하는대로 코딩을 하여 사진을 올려보았습니다. 예외처리를 처리하는 메소드를 하나 만들고 값을 입력하고 버튼을눌렀을 때 이 메소드를 호출하고 메소드에 들어가는 값이랑 데이터베이스에 있는 첫번째 레코드부터 마지막레코드까지 루프를 돌려 확인하고 카운터 값이 오르면 중복시간표가 존재하는 것이고, 카운터가 1이상이면 시간표가 등록되지 않게 구현해보려고 했습니다. 시작한지 얼마 안된 초보라서 답답해도 도움 부탁드려요ㅠ

by 마농 [2019.01.16 15:17:41]

네. 맞습니다.
구간 겹치는지는 시작 종료를 서로 교차하여 비교하시면 됩니다.
이는 DBMS 종류와 관계 없는 일반적인 내용입니다.
그리고 커서 루프 돌릴 필요는 없어 보입니다.
 

SELECT COUNT(*) cnt
  FROM tabledb
 WHERE week      = :v_week
   AND starttime < :v_endtime
   AND endtime   > :v_starttime
;

 


by 카이 [2019.01.16 16:33:08]
    public int Check(String weekA, String weekB ,String starttimeA, String endtimeA, String starttimeB, String endtimeB ) {
        sql = "SELECT COUNT(*) cnt FROM tabledb where '"+weekA+"' = '"+weekB+"' AND '"+starttimeA+"' < '"+endtimeB+"'  AND '"+endtimeA+"' > '"+starttimeB+"'";
        cursor = db.rawQuery(sql, null);
        count = cursor.getCount();
        return count;
    }

이런식으로 구현하여 count값이 0이하일때와 1이상일때 두 상황으로 나누어서 판별하는쪽으로 구현하려고 했는데 중복이 없는데도 카운터값이 0이 아닌지 이미 등록된 강의라고 나옵니다 ㅠ


by 마농 [2019.01.16 16:47:59]

변수 처리는 우변쪽 3개만 해야 하는데?
좌변쪽도 같이 변수처리하고 있네요?
좌변은 컬럼명, 우변은 입력변수


by 카이 [2019.01.16 17:55:28]

아 제가 이해를 잘못하고 있었나 보군여 아직해결은 못했지만 감사합니다!


by 카이 [2019.01.18 11:19:34]

혹시 cnt의 리턴값은 DBMS 멤버필드에 들어있는 건가여? COUNT(*) cnt를 리턴받고 싶은데 어떻게 리턴 받아야할지 잘모르겠습니다


by 마농 [2019.01.18 13:31:56]
Int cnt = 0;
if(cursor.moveToFirst())
{
    cnt = cursor.getInt(1);
}

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입