Android 自定义ContentProvider和ContentObserver的完整使用

在自定义ContentProvider结合ContentObserver一起使用时,,自己写的ContentProvider,在执行完insert、delete和update后,要手动地调用getContentResolver().notifyChange()这个方法来通知改动的产生。

直接上代码:

MainActivity

<span style="font-family:SimSun;font-size:14px;"><span style="font-family:SimSun;font-size:14px;">package com.jackie.contentobserver;import java.util.ArrayList;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.ContentResolver;import android.content.ContentUris;import android.content.ContentValues;import android.database.Cursor;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {private ArrayList<Person> mList;private ListView mListView;private ContentResolver resolver;private MyBaseAdapter mBaseAdapter;private Handler mHandler;private AdapterContentObserver mAdapterContentObserver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (ListView) findViewById(R.id.lv_person);initData();mBaseAdapter = new MyBaseAdapter(this, mList);mListView.setAdapter(mBaseAdapter);mHandler = new Handler();mAdapterContentObserver = new AdapterContentObserver(this, mHandler);resolver.registerContentObserver(Uri.parse("content://com.jackie.provider.person/person"), true, mAdapterContentObserver);//注册短信变化监听//this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content)}@Overrideprotected void onDestroy() {resolver.unregisterContentObserver(mAdapterContentObserver);super.onDestroy();}private ArrayList<Person> initData() {mList = new ArrayList<Person>();resolver = getContentResolver();Cursor cursor = resolver.query(Uri.parse("content://com.jackie.provider.person/person"), null, null, null, null);while (cursor.moveToNext()) {Person person = new Person();person.set_id(cursor.getInt(cursor.getColumnIndex("_id")));person.setName(cursor.getString(cursor.getColumnIndex("name")));mList.add(person);}return mList;}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.activity_main, menu);return true;}@Overridepublic boolean onMenuItemSelected(int featureId, MenuItem item) {switch (item.getItemId()) {case R.id.menu_settings://AlertDialog.Builder builder = new AlertDialog.Builder(this);//builder.setTitle("提示").setMessage("您确定要退出?");//builder.create().show();ContentValues values = new ContentValues();values.put("name", "Jackie");Uri mUri = resolver.insert(Uri.parse("content://com.jackie.provider.person/person"), values);//方法一: 重新查询数据库实时刷新//mBaseAdapter = new MyBaseAdapter(this, initData());//mListView.setAdapter(mBaseAdapter);//方法二: 当adapter绑定的list变化时,调用adapter的notifyDataSetChanged方法实时刷新(不用重复查询数据库,效率更高)//long id = ContentUris.parseId(mUri);//mList.add(new Person(id, "chengjie"));//mBaseAdapter.notifyDataSetChanged();//方法三: 内容观察者ContentObserver<span style="color:#ff0000;">//自己写的ContentProvider,在执行完insert、delete和update后,要手动地调用getContentResolver().notifyChange()这个方法来通知改动的产生(请参考MyProvider.java的方法)</span>break;default:break;}return super.onMenuItemSelected(featureId, item);}}</span></span>

AdapterContentObserver.java<span style="font-family:SimSun;font-size:14px;"><span style="font-family:SimSun;font-size:14px;">package com.jackie.contentobserver;import android.content.ContentResolver;import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;import android.util.Log;import android.widget.Toast;public class AdapterContentObserver extends ContentObserver {private Context context;private Handler handler;private static final int PERSON_UPDATE = 0;public AdapterContentObserver(Handler handler) {super(handler);// TODO Auto-generated constructor stub}public AdapterContentObserver(Context context, Handler handler) {super(handler);this.context = context;this.handler = handler;}//当监听的Uri发生变化,便会执行这个方法@Overridepublic void onChange(boolean selfChange, Uri uri) {super.onChange(selfChange, uri);ContentResolver resolver = context.getContentResolver();// 获取最新的一条数据Cursor cursor = resolver.query(uri, null, null, null, "_id desc limit 1");while (cursor.moveToNext()) {int _id = cursor.getInt(cursor.getColumnIndex("_id"));Toast.makeText(context, "数据库更新了, _id 为: " + _id, Toast.LENGTH_SHORT).show();}cursor.close();}}</span></span>影子依旧可以相亲相爱。哪一块骨骼最温暖,总能一击即中。

Android 自定义ContentProvider和ContentObserver的完整使用

相关文章:

你感兴趣的文章:

标签云: