제가 리스트뷰에 나온 데이터를 삭제를 하려고 하는데,
처음에 테이블을 만들때
// DB table 만들기
String sql = "CREATE TABLE IF NOT EXISTS CATEGORY (";
sql += "Cate_Num INTEGER not null primary key autoincrement,";
sql += "Cate_Sub TEXT not null";
sql += ");";
이렇게 autoincrement을 사용함으로써 제가 일일이 번호를 넣어주는 것을 방지하였습니다.
헌데 문제는 여기서 시작됐습니다.
제가 편하려고 autoincrement를 썼던 부분이
나중에 데이터를 추가/삭제를 반복 했더니
번호가 계속 올라가서 나중에 이 번호를 리스트뷰에 나온대로 제일 위에 있는 데이타기 때문에 ==0일때..로 if문을 만들었는데,
ex) 리스트 뷰
0 <- 데이터 순서
1
2
3
4
데이터가 삭제가 안되고 런타임 오류를 발생하였습니다.
그래서 제가 토스트를 이용하여 확인해 본 결과 autoincrement로 인하여 데이터를 집어넣으면 넣을 수록 숫자는 증가하게 되고
10번의 데이터를 집어넣었다 하여도 10개를 다 지우고 1개의 데이터를 추가시켜도 그 데이터는 1이 아니라 11이라는 값을 가지고 있는
것이었습니다.
그래서 이 부분을 어떻게 해결하면 좋을지 고민입니다.
혹시 좋은 방법이 없으련지 궁금합니다.
또 제가 DB에 저장되어 있는 마지막 번호를 넣어주려고 해보았지만,
1 ~ 4 의 데이터를 넣고, 2를 제외한 나머지 1,3,4를 지웠을 때,
그 데이터는 2의 번호를 갖고 있기 때문에,
lastID를 찾아서 넣어줄 경우 num = 2 로 충돌이 일어날 것이라는 예상으로 시도는 해보지 않았지만, 안봐도 비디오 일 것 같습니다.
어떻게 피해간다고 해도 소스가 길어지고, 이건 비효율적인 소스코딩일까 싶어서 쓰지 않았습니다.
혹시 좋은 아이디어를 갖고 계신분이 있으시다면 댓글 달아주시면 감사하겠습니다~
개인적인 메일 주소는 seodaeya@gmail.com 입니다. 메일로도 보내주시면 감사하겠습니다.
인덱스가 유지되는 걸 원하시는 것 같은데, 그런 경우엔 autoincrement를 잡을 게 아니라 마지막 값에서 +1을 하는 형태로 insert 쿼리를 짜고, 지우는 경우에는 db에 저장된 값들의 id를 재설정하는 과정을 거치셔야 하지 않나 싶습니다.
아니면 제일 위의 값을 ==0으로 캐치할 게 아니라 다른 방식으로 캐치해야겠죠. select 쿼리의 결과가 어차피 db 안에 입력된 순서대로 나온다는 걸 생각하면(아니더라도 order by 쿼리로 설정할 수 있죠) 값을 홀딩하든가 아니면 delete 쿼리 자체에 select 쿼리를 넣고 limit 1을 쓰든가 방법은 많을 것 같은데요.




어댑터에서 pk를 저장하고 삭제시에는 저장된 pk로 지워주시면 됩니다.