ContentProviderでのデータの変更の傍受

1949 ワード

2つのアプリケーションA,Bが同時にContentProviderに問い合わせる場合、Aアプリケーションがデータベース内のデータを更新した場合、どのようにしてBアプリケーションもContentProviderの変化を自動的に傍受し、更新されたデータを得ることができますか?
次はBのアプリのactivity

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person");
        getContentResolver().registerContentObserver(uri, true, new PersonProviderObServer(new Handler()));
    }
    
    private final class PersonProviderObServer extends ContentObserver{

		public PersonProviderObServer(Handler handler) {
			super(handler);
		}

		@Override
		public void onChange(boolean selfChange) {
			Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person");
			ContentResolver contentResolver = getContentResolver();
			// select * from person order by personid desc limit 1
			Cursor cursor = contentResolver.query(uri, null, null, null, "personid desc limit 1");
			if(cursor.moveToFirst()){
				int personid = cursor.getInt(cursor.getColumnIndex("personid"));
				String name = cursor.getString(cursor.getColumnIndex("name"));
				String phone = cursor.getString(cursor.getColumnIndex("phone"));
				int amount = cursor.getInt(cursor.getColumnIndex("amount"));
				Log.i("MainActivity", "id="+ personid+ ",name="+ name+ ",phone="+ phone+ ",amount="+ amount);
			}
		}
    }
}

注意:Aアプリケーションがデータを更新した後、Bアプリケーションに対して、次のコードを使用することを自発的に通知する必要があります.
getContext().getContentResolver().notifyChange(uri, null);