마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

DB의 삭제에 대해서 조언 부탁드립니다.

0 추천

안녕하세요. 

DB를 사용해서 어플을 만들고 있습니다. 

리스트뷰를 통해서 DB값이 뿌려지고

리스트뷰에 뿌려진 아이템을 선택하면 리스트뷰의 포지션값을 이용하여

DB의 ID값을 불러와 사용했습니다.

 

DB값

_id DB값
1 A
2 B
3 C
4 D

리스트뷰

A
B
C
D

이런식입니다.

 

그런데 DB의 제거는 ArrayList와 처럼 중간의 값이 제거되면 앞의 값을 대체하는 것이 아니거 

DB의 제거된 공간은 빈공간이 된다는것이 문제입니다.

DB  1 / 2 / 3 / 4

List 1 / 2 / 3 / 4

3이라는 값이 제거되면 

 

DB  1 / 2 / 4

List 1 / 2 / 3

이런시으로 되서 ListView에 뜨는 값이 꼬이게 됩니다.

 

------------------------------------------해결방법?--------------------------------------------

그래서 해결방법으로 생각한것이 ... DB값이 제거될때마다 DB를 처음부터 다시 설정하는 것 .

(이건 생각만했는데 비효율적일것 같습니다.)

 

그리고 다른 방법은 DB에 new_id 값을 문들어줘서 _id와 같은 갑을 주다가 값이 제거되면

다음 new_id 값을 -1해줘서 마춰주는 방법입니다. (해보질않아서 모르겠지만 어려울거같네요 ;;; )

_id new_id
1 1 A
2 2 B
3 3 C
4 4 D

C의 값이 제거되면

A
B
D

 

_id new_id
1 1 A
2 2 B
4 4

D

수정

_id new_id
1 1 A
2 2 B
4 3 D
 

제거된 3의 다음 new_id 값 부터 -1 해주는 DB 업데이트를 해주는 것입니다.

참 설명이 복잡하게된거 같은데 ...

 

보통 리스트뷰를 통해 DB뿌리고 리스트뷰를 통해서 DB값과 리스트뷰값을 지우는건 어떤방식인이 알고 싶습니다.

조언 부탁드립니다. ㅠㅠ

Hui (590 포인트) 님이 2013년 3월 12일 질문

2개의 답변

+1 추천
변할 수 있는 ListView의 포지션값으로 쿼리를 날리는게 문제군요.

ListView에 뿌려질 객체가 DB의 id값이나 다른 primary key값을 가지고 있다면 전혀 문제될 것 없지 않을까 합니다.
appa (3,380 포인트) 님이 2013년 3월 13일 답변
맞습니다. _id값 말고 A B C D 가 들어간 컬럼을 기준으로 컨트롤하면 되는문제인데
리스트 뷰에 뿌려진 다른 DB값에 접근하려면 일단 접근을 위해
리스트뷰의 포지션값을 얻어서 그 포지션값과 _id를 비교해서 DB에 접근하는 방식을 사용했습니다.

DB에 대한 지식이  짧아서 질문 드립니다.특정 값을 기준으로 접근하시라는 말같은데 , 일단 비교 접근 할수 있는 기준이 _id 뿐이라고 생각됩니다. 리스트 뷰에서 얻을수있는 것이 포지션 값뿐인것 같은데 ...

에딧텍스트를 나두고 거기에 값을 써서 비교할수도 없고 어떻게 ABCD를 기준으로 사용하라는지 조언 부탁드립니다.
저는 이런 경우 DB에서 가져온 '_id'와 '값'을 가지고 있는 객체를 만들어서 ArrayAdapter를 재정의하여 그 객체의 '값'만 화면에 뿌려주고 OnItemClick이벤트에서 해당 포지션의 객체를 불러와 '객체._id' 값으로 DB에 쿼리를 날려주는 식으로 구현합니다.
다시 말씀드리면 지금 기본 Adapter에 String값만 뿌려주시는 것 같은데 따로 DB의 '_id'값도 가지고 있을 수 있게 커스텀하셔서 아이템을 선택하여 쿼리를 날릴 때 언제든지 변할 수 있는 ListView 포지션 값으로 날리지 마시고, 유일한값으로 찾을 수 있게 그 포지션의 객체가 DB의 primary-key값도 가지고 있으면 된다는 겁니다.
0 추천
저같은 경우에는 기준이 되는 데이터를 ArrayList<HashMap<String,Object>> 형태로 만들어서 사용합니다.

 

HashMap에는 디비의 로우별 데이터를 가지고있지요.

ArrayList에서는 ListView에서 선택한 position값으로 HashMap객체에 접근하고

HashMap에서 DB에서 사용하는 아이디 값을 찾아서 DB작업을 수행합니다.

물론 DB작업 수행후 삭제한 HashMap객체는 ArrayList에서 remove시켜주지요.

그러면 ArrayList와 ListView의 포지션은 맞춰집니다.
이라슈 (8,770 포인트) 님이 2013년 3월 13일 답변
...