앱툴즈
46.♡.168.138
46.♡.168.129
46.♡.168.161
46.♡.168.136
46.♡.168.145
46.♡.168.162
46.♡.168.144
46.♡.168.140
115.♡.135.198
46.♡.168.139
 
게시물 88건
   
주소록 추가/삭제 감지해서 앱의 db추가/삭제하기.
글쓴이 : 김병주                   날짜 : 2012-09-24 (월) 13:44 조회 : 11328
앱을 개발 하다보면 주소록을 사용하는 경우가 있는데, 이 경우 동기화 문제가 발생 합니다.
 
주로 계정을 생성해서 동기화 하는 방법을 많이 쓰시는데, 이 경우에는 바인더나 서비스를 사용해야
 
된다는 점때문에 일부 앱에서는 사용하기가 힘든 경우가 있습니다.
 
(AIDL로 통신하거나, 이미 바인더에서 처리하는 것이 있어 계정 생성 및 동기화 모듈을 넣기 힘들 경우...)
 
안드로이드에서는 Observer 라는 개념(사실 자바에도 있습니다만..)을 이용해서 Content들의 이벤트를 감지 하는 것이 있습니다.
 
ContentObserver
라는 것인데. 이는 핸들러를 통해 obtainmessage로 일정 메세지에 따라 이벤트를 발생시킬 수도 있고
 
주소록에 옵저버를 연결하면 쿼리가 발생할때마다 이벤트를 발생시켜 사용자에게 알려줍니다.
 
ContentObserver mmm = new ContentObserver(new Handler()) {
  /* (non-Javadoc)
   * @see android.database.ContentObserver#deliverSelfNotifications()
   */
  @Override
  public boolean deliverSelfNotifications() {
   // TODO Auto-generated method stub
   return super.deliverSelfNotifications();
  }
  /* (non-Javadoc)
   * @see android.database.ContentObserver#onChange(boolean)
   */
  @Override
  public void onChange(boolean selfChange) {
   // TODO Auto-generated method stub
   super.onChange(selfChange);
  }
  
 };
 
대충 이클립스로 생성하게 되면 onChange와 deliverSelfNotifications(); 가 있습니다.
 
deliver는 말그대로 사용자에게 이벤트를 알려주는 Noti( 시각적인)를 발생시켜주는 곳이고,
 
onChange는 이벤트가 발생되었을 때 호출됩니다.
 
ContentResolver cr = getContentResolver();
  cr.registerContentObserver(RawContacts.CONTENT_URI, false, mmm);
 
주소록에서 옵저버의 등록은 위와 같이 선언하시면
 
추가,삭제,업뎃 등의 이벤트를 감지할때마다 onChange를 불러줍니다.
 
단, 이 onChange는 이벤트 발생만 알려줄뿐 어떤 파라메터도 넘겨주지 않습니다.
 
따라서 사용자는 이 이벤트가 발생할때, 주소록을 새로 불러와서 추가할건 추가하고 삭제나 갱신할건
 
갱신하시면 됩니다.
 
하지만 삭제의 경우 삭제된 아이디를 찾기 위해 상당히 많은 작업을 해야되는 경우가 있는데,
 
이를 방지하기 위해
 
CopyDB(앱의 DB)쪽에 deleted 필드를 하나 만들어줍니다. (append로 하시던 업데이트하면서 추가하시던...)
 
삭제의 경우 모든 row에 대해 deleted 필드를 전부 delete 상태로 설정하시고,
 
주소록에서 아이디를 받아와 있는것만 notdelete 상태로 바꿔주시면 됩니다.
 
(경우에 따라 많은 시간이 소비 될 수 있으니, 이부분은 asyncTask를 이용하시면 됩니다.)
 
추가의 경우는 없는 id가 나올경우 해당 아이디필드의 인덱스를 가져와 추가해주시면 됩니다.
 
삭제전
 
[_id][Name][EMAIL][PHONE1][PHONE2][ADDRESS][THUMBNAIL][PHONE_ID][deleted]
1       k            dd         0101                           102        content://          1                1
 
삭제 후
 
[_id][Name][EMAIL][PHONE1][PHONE2][ADDRESS][THUMBNAIL][PHONE_ID][deleted]
1       k            dd         0101                           102        content://          1                0
 
삭제된것 빼고 가져올 때,
 
db.query(DATABASE_TABLE, new String[] { KEY_ROWID,.....DATABASE_ID,DATABASE_COL_STATUS},null,null,DATABASE_ID, DATABASE_COL_STATUS+" > 0 ", null);
 
이런식으로 Group By Having을 이용하시면 delete 상태가 아닌 값들만 선택하여 가져오게 됩니다.
 
DB의 경우 필요없는 값이 너무 쌓이게 되면 deleted가 0으로 셋팅되 있는 것을 뽑아와
 
일괄 삭제 해주시면 됩니다.
 
(이 방법은 대부분의 주소록에서 사용 되고 있는 방식이기도 합니다.)
 
* 글을 등록하실때 꼭 필요한 경우가 아니면 개인정보를 남기지 마세요 ^^ (연락처,이메일주소,주민등록번호 등)




김병주 님의 Tip&Tech 최신글 [더보기]


   

게시물 88건
번호 제목 글쓴이 날짜 조회
88  <클라우드혁신센터> 12월 1일 SW 스타트업 창업 성공 전략 세미나 참석 요청 준모 11-30 2550
87  <클라우드혁신센터> 12월 1일 SW 스타트업 창업 성공 전략 세미나 준모 11-23 2483
86  개인개발자 SW개발환경 지원사업 안내 준모 10-28 2682
85  맥에서 구글 API key 등록방법 성기동 08-29 3575
84  [Agate Mobile] 앱 설치 없이 서버로부터 실시간 로딩 되어 동작하는 Cloud Native App 프레임워크입니다. 씨트린개발… 07-21 6325
83     [Agate Mobile] 앱 설치 없이 서버로부터 실시간 로딩 되어 동작하는 Cloud Native App 프레임워크입니다. 김은호 08-21 10877
82  자바 초보들에게 추천하는 기초 개념을 잡을 수 있는 책들 이경용 06-19 4719
81  [팁] 갤럭시 노트3 개발자 옵션 메뉴 찾기 ^^ 이경용 11-09 8627
80  앱템플릿을 제공하는 사이트 소개합니다. 씨트린개발… 08-21 11228
79  The content of the adapter has changed but ListView ... 에러 일반적 해결법. 김병주 04-16 14275
78  간단하게 패스워드에 숫자가 혼용되었는지 처리할 수 있는 메소드입니다. 김병주 01-31 5350
77  handler를 이용해 가변시간 반복 작업하기. 김병주 11-26 7257
76  String -> HEX 김병주 11-12 4639
75  리스트 작업시에 기본적으로 알아두셔야 될점. +1 김병주 10-08 5718
74  xml 직렬처리 고범석 09-24 3760
73  주소록 추가/삭제 감지해서 앱의 db추가/삭제하기. 김병주 09-24 11329
72  확장리스트가 3뎁스 이상이 될까? 안될까? +1 김병주 08-21 6504
71  ZXing 바코드 스캔부분 크기 조절하기. 김병주 08-06 13374
70  이클립스에서 레이아웃 xml 그래픽부분이 갑자기 안보일경우. +1 김병주 07-27 5330
69  간만에 글쓰네요 이번엔 launcherShortCut (바로가기 아이콘)입니다. 김병주 07-25 10894
 1  2  3  4  5  
 
 
 
Copyright ⓒ wwwold.androidstudy.co.kr. All rights reserved.