현재 위치 - 인적 자원 플랫폼망 - APP 자료 - 안드로이드 데이터베이스는 데이터 변경 사항을 어떻게 모니터링합니까?
안드로이드 데이터베이스는 데이터 변경 사항을 어떻게 모니터링합니까?
Android 에서는 데이터베이스의 업데이트 내용을 사용하기 전에 데이터베이스의 내용을 변경하는 데 자주 사용됩니다. 많은 사람들이 다시 쿼리하지만 문제는 프로그램이 특수 메모리를 사용하고 커서를 닫으면 프로그램 메모리가 해제되지 않을 수 있다는 것입니다. 실제로 Android 는 데이터베이스 컨텐츠의 변경 사항을 모니터링하는 ContentObserver 를 제공합니다.

ContentObserver 의 생성자에는 Hanlder 매개 변수가 필요합니다. ContentObserver 는 내부 클래스를 사용하여 Runnable 에게 데이터베이스 내용을 변경하는 runnable 인터페이스를 구현하기 때문입니다. 너는 hanlder 를 사용하여 메시지를 게시해야 한다. ContentObserver 를 등록하려면 get Content Resolver () 를 사용합니다. 콘텐츠 서버 (URI, NotifyForDescendents, 관찰자) 를 등록합니다.

위의 세 가지 매개 변수인 Uri-uri type 은 모니터할 데이터베이스의 uri 입니다.

Notifyfordescendants-boolean? True 는 이 URI 와 관련된 모든 uri 를 수신합니다. False 이면 수신할 직접적이고 특별한 uri 입니다. 보통 true 로 설정됩니다.

관찰자-컨텐트 관찰자? 이것이 바로 당신이 필요로 하는 내용 관찰자입니다.

ContentObserver 객체를 초기화하고 onChange(boolean) 를 다시 로드하여 변경된 용도에 맞게 데이터베이스 사용을 조작합니다.

작은 데모를 썼는데 참고할 수 있어요. 이 모니터링 방법은 contentprovider 에 uri 가 있으므로 contentprovider 여야 합니다. Uri 없이는 간단한 SQLite 데이터베이스를 사용할 수 없습니다.

다음 데모에서는 한 활동 a 의 버튼을 클릭하여 다른 활동 b 로 이동하고 b 의 버튼을 클릭하여 데이터베이스에 데이터를 추가한 다음 b 를 닫고 a ... 로 돌아가는 버튼 텍스트가 자동으로 변경되어 데이터베이스의 문자열로 설정됩니다. [코드]

소포? Ty.com.lto;;

02?

03 가져오기? Android.app.activity;

04 수입? Android.content.intent;

05 수입? Android.database.contentobserver;

06 수입? 안드로이드.os.bundle;

07 수입? 안드로이드.os.handler;

08 수입? Android.view.view;

09 수입? Android.widget.button;

10?

1 1 공용? 반? ListenDataTest? 확장? 활동 {

12private? 버튼? 테스트 BTN

13?

14 @ 덮어쓰기

15 보호? 무효화? OnCreate (번들? SavedInstanceState)? {

16super.oncreate (savedinstancestate);

17 setcontentview (R. layout.listen _ data _ test);

18? GetContentResolver () 를 사용합니다. Registercontentobserver (datachangeprovider). 컨텐츠 _URI

19 참,? Cob);

20?

21테스트 BTN? =? (button) findviewbyid (r.id.test _ BTN);

22testBtn.setOnClickListener (신규? 살펴보다. OnClickListener ()? {

23?

24 공공? 무효화? OnClick (보기? 5)? {

25 의도? 네? =? NewIntent(ListenDataTest.this, datachangetest.class);

26 start activity (in);

27?

28}

29});

30?

3 1}

32?

33 개인? ContentObserver? 코브? =? 새 것? ContentObserver (신규? 처리기 ()? {

34?

35 @ 초월

36 공공? 부울? DeliverSelfNotifications ()? {

37 반환? Super.deliverselnotifications ();

38}

39?

40 @ 초과

4 1 공용? 무효화? OnChange (부울? 자기 변화)? {

42super.onChange (자기 변화);

43? Testbtn.settext (datautils.getchangename (getapplicationcontext ());

44}

45

46? }

47?

48 @ 초월

49 보호? 무효화? OnDestroy ()? {

50super.ondestroy ();

5 1getContentResolver () 입니다. Unregistercontentobserver (cob);

52}

53

54

55}

[코딩] 0 1 패키지? Ty.com.lto;;

02?

03 가져오기? Android.app.activity;

04 수입? Android.content.contentvalues;

05 수입? Android.content.intent;

06 수입? Android.database.contentobservable;

07 수입? Android.database.contentobserver;

08 수입? 안드로이드.os.bundle;

09 수입? 안드로이드.os.handler;

10 가져오기? Android.view.view;

1 1 수입? Android.widget.button;

12?

13public? 반? DataChangeTest? 확장? 활동 {

14? 개인? 버튼? 데이터 BTN

15? DataSqlite? MDataSqlite

16? @ 덮어쓰기

17? 보호받고 있습니까? 무효화? OnCreate (번들? SavedInstanceState)? {

18 super.oncreate (savedinstancestate);

19 setcontentview (R. layout.data _ change _ test);

20 데이터 BTN? =? (button) findviewbyid (r.id.data _ test _ BTN);

2 1mDataSqlite? =? 새 것? 데이터 스프라이트 (이것);

22dataBtn.setOnClickListener (신규? 살펴보다. OnClickListener ()? {

23?

24 공공? 무효화? OnClick (보기? 5)? {

25 컨텐츠 값? 사기? =? 새 것? Contentvalues ();

26con.put ("이름", "데이터 변경됨");

27getContentResolver () 를 사용합니다. Insert(DataChangeProvider). 컨텐츠 _URI,? Con);

28finish ();

29}

30});

3 1? }

32}

[코드] 보기? 소스 인쇄?

00 1 패키지? Ty.com.lto;;

002

003

004 수입? Android.content.contentprovider;

005 수입? Android.content.contenturis;

006 수입? Android.content.contentvalues;

007 수입? Android.content.context;

008 수입? Android.content.urimatcher;

009 수입? 안드로이드. 데이터베이스. 커서

0 10 가져오기? Android.database.sqlexception;

0 1 1 수입? Android.database.sqlite.sqlitedatabase;

0 12 가져오기? Android.database.sqlite.sqliteopenhelper;

0 13 가져오기? Android.database.sqlite.sqlitequerybuilder;

0 14 가져오기? Android.database.sqlite.sqlitedatabase.cursorfactory;

0 15 가져오기? Android.net.uri;

0 16 가져오기? Android.text.textutils;

0 17

0 18 공용? 반? DataChangeProvider? 확장? ContentProvider{

0 19 개인? SQLiteOpenHelper? MOpenHelper

020 개인? 정전기? 결승전? Int? 경보? =? 1;

02 1 개인? 정전기? 결승전? Int? 경고 _ID? =? 2;

022 개인? 정전기? 결승전? UriMatcher? 외과의사? =? 새 것? UriMatcher(UriMatcher) 입니다. No _ match);

023public? 정전기? 결승전? 유리? 컨텐츠 _URI? =? Uri.parse ("content://ty.com.lto/test");

024

025 정전기? {

026surlmatcher.adduri ("ty.com.lto",? "테스트",? 경보);

027surlmatcher.adduri ("ty.com.lto", "test/#",? Alarms _ id);

028}

029?

030 개인? 정전기? 반? DatabaseHelper? 확장? SQLiteOpenHelper{

03 1? 개인? 정전기? 결승전? 문자열? 테스트 _ 데이터베이스? =? "테스트.db";

032? 개인? 정전기? 결승전? Int? 버전? =? 1;

033

034? 공공? DatabaseHelper (컨텍스트? 컨텍스트)? {

035? 수퍼 (컨텍스트,? 테스트 _ 데이터베이스,? 널,? 버전);

036? //? 토도? 자동 생성? 건설사? 담배 꽁초

037? }

038?

039

040? @ 덮어쓰기

04 1? 공공? 무효화? OnCreate(SQLiteDatabase? Db)? {

042? 문자열? Sql? =? "창조? 표? " +"테스트"+"? ("? +

043? "_id? 정수? 초급? 키, "? +

044? \ "이름? 문자? " +

045 ");" 을 눌러 섹션을 인쇄할 수도 있습니다

046? Db.exec SQL (SQL);

047? }

048

049? @ 덮어쓰기

050? 공공? 무효화? OnUpgrade(SQLiteDatabase? Db,? Int? 이전 버전,? Int? NewVersion)? {

05 1? 문자열? Sql? =? "아래로? 책상? 만약? 존재합니까? " +테스트 _ 데이터베이스

052? Db.exec SQL (SQL);

053? Oncreate (db);

054? }

055

056}

057?

058 공공? DataChangeProvider ()? {

059}

060?

06 1 @ 덮어쓰기

062public? Int? 삭제 (Uri? 웹사이트 주소,? 문자열? 어디? String[]? WhereArgs)? {

063 SQLite 데이터베이스? Db? =? Mopenhelper.getwritabledatabase ();

064int? 셀 수 있습니다.

065 용? RowId? =? 0;

066 스위치? (sURLMatcher.match(url))? {

067 사건? 경고:

068 카운트? =? Db.delete ("테스트", 어디? Where args);

069break

070 건? 경고 _ID:

071문자열? 세그먼트? =? Url.getPathSegments () 를 사용합니다. Get (1);

072

pt type="text/javascript" src="/style/tongji.js">