2012-03-23 1 views
0

저는 Activity와 BroadcastReceiver의 두 부분으로 구성된 응용 프로그램을 개발 중입니다. BroadcastReceiver는 들어오는 SMS를 처리하고 데이터베이스에 새 행을 만들 수 있습니다.비동기 SQLite 데이터베이스 행 추가 처리

문제점 : BroadcastReceiver가 데이터베이스에 새 행을 추가하는 동안 활동이 열려 있고 활성화되어있는 경우 - 새 행이 활동의 ​​ListView에 나타나지 않습니다.

listView의 커서에 대해 커서 관찰자를 사용하려고 시도했지만 관찰자가 행 변경에 대해서만 알림을 트리거합니다. 새로운 행에 옵저버는 아무 것도하지 않습니다.

m_testCursor = m_dbAdapter.fetchAll(); 
m_testCursor.registerContentObserver(
    new ContentObserver(new Handler()) 
    { 
     @Override 
     public void onChange(boolean selfChange) 
     { 
      Log.w("my_tag", "test content changed");      
     } 
    } 
); 

m_testCursor.registerDataSetObserver(
    new DataSetObserver() 
    { 
     @Override 
     public void onChanged() 
     { 
      Log.w("my_tag", "test data set changed");      
     } 
    } 
); 

SimpleCursorAdapter checks = new SimpleCursorAdapter(this, R.layout.nodes_row, m_testCursor, from, to); 
setListAdapter(checks); 

은 어떻게 든 브로드 캐스트 리시버 부분에서 활동의 새로운 행 추가를 처리 할 수 ​​있습니다 여기에

코드 샘플입니다? 필요한 것은 UI 새로 고침 메서드 중 하나를 트리거하는 것입니다.

답변

0

checks 개체를 브로드 캐스트 수신기에서 사용할 수 있습니까? 그렇다면 UI 새로 고침 메서드 만 있으면 데이터 집합이 변경 될 때 checks.notifiDatasetChanged()으로 간단히 전화해야한다고 생각합니다.

0

setNotificationUri()ContentResolvernotifyChange()에있는 데이터베이스 호출에서 변경할 수 있습니다. ContentResolver 호출을 얻으려면 getContentResolver(). 모두 데이터베이스에

Uri uri = Uri.parse("content://your_database"); 
m_testCursor = m_dbAdapter.fetchAll(); 
m_testCursor.setNotificationUri(getContentResolver(),uri) 

당신의 활동에

를 호출에 변화

Uri uri = Uri.parse("content://your_database"); 
getContentResolver().notifyChange(uri, null); 

후 방법/삭제/업데이트를 만들 때와 같은 URI를 사용하여 당신은 또한 fetchAll() 방법으로 직접 setNotificationUri()를 호출 할 수 있으며, Uri를 db 클래스의 정적 최종 인스턴스 변수로 사용하지 마십시오.

관련 문제