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

直接上代码:

MainActivity

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; @Override
protected 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)
} @Override
protected 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;
} @Override
public 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;
} @Override
public 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
//自己写的ContentProvider,在运行完insert、delete和update后,要手动地调用getContentResolver().notifyChange()这种方法来通知修改的产生(请參考MyProvider.java的方法) break; default:
break;
}
return super.onMenuItemSelected(featureId, item);
} }

AdapterContentObserver.java

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发生变化。便会运行这种方法
@Override
public 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();
}
}

DBHelper.java

package com.jackie.contentobserver;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists person(_id integer primary key autoincrement, name text)");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

MyBaseAdapter.java

package com.jackie.contentobserver;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; public class MyBaseAdapter extends BaseAdapter { private ViewHolder holder;
private Context context;
private ArrayList<Person> mList; public MyBaseAdapter(Context context, ArrayList<Person> mList) {
this.context = context;
this.mList = mList;
} @Override
public int getCount() {
return mList.size();
} @Override
public Object getItem(int position) {
return mList.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = LayoutInflater.from(context);
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.listview_item, null);
holder.idTexitView = (TextView) convertView.findViewById(R.id.tv_id);
holder.nameTextView = (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.idTexitView.setText(mList.get(position).get_id() + "");
holder.nameTextView.setText(mList.get(position).getName());
return convertView;
} class ViewHolder {
TextView idTexitView;
TextView nameTextView;
}
}

MyProvider.java

package com.jackie.contentobserver;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri; public class MyProvider extends ContentProvider {
private final static String AUTHORITH = "com.jackie.provider.person"; private final static String PERSONS_PATH = "person"; private final static String PERSON_PATH = "person/#"; private final static int PERSON = 1; private final static int PERSONS = 2; private final static String DATABASE_NAME = "person_db"; private final static String TABLE_NAME = "person"; private final static String TABLE_COLUMN_ID = "_id"; private final static String TABLE_COLUMN_NAME = "name"; private final static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static {
mUriMatcher.addURI(AUTHORITH, PERSONS_PATH, PERSONS);
mUriMatcher.addURI(AUTHORITH, PERSON_PATH, PERSON);
} private DBHelper helper = null; @Override
public boolean onCreate() {
helper = new DBHelper(getContext(), DATABASE_NAME, null, 1);
return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase database = helper.getWritableDatabase();
switch (mUriMatcher.match(uri)) {
case PERSON:
long id = ContentUris.parseId(uri);
String where = TABLE_COLUMN_ID + "=" + id;
if (selection != null && !"".equals(selection)) {
selection = where + "and" + selection;
}
return database.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); case PERSONS:
return database.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); default:
throw new IllegalArgumentException("UnKnown uri: " + uri);
}
} @Override
public String getType(Uri uri) {
switch (mUriMatcher.match(uri)) {
case PERSON:
return "vnd.android.cursor.item"; case PERSONS:
return "vnd.android.cursor.dir"; default:
throw new IllegalArgumentException("UnKnown uri: " + uri);
}
} @Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase database = helper.getWritableDatabase();
long id = database.insert(TABLE_NAME, TABLE_COLUMN_NAME, values);
//向外界通知该ContentProvider里的数据发生了变化 ,以便ContentObserver作出对应
getContext().getContentResolver().notifyChange(uri, null);
return ContentUris.withAppendedId(uri, id);
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase database = helper.getWritableDatabase();
switch (mUriMatcher.match(uri)) {
case PERSON:
long id = ContentUris.parseId(uri);
String where = TABLE_COLUMN_ID + "=" + id;
if (selection != null && !"".equals(selection)) {
selection = where + "and" + selection;
}
return database.delete(TABLE_NAME, selection, selectionArgs); case PERSONS:
return database.delete(TABLE_NAME, selection, selectionArgs); default:
throw new IllegalArgumentException("UnKnown uri: " + uri);
}
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
} }

Person.java

package com.jackie.contentobserver;

public class Person {

	private long _id;
private String name;
public Person(long _id, String name) {
super();
this._id = _id;
this.name = name;
} public Person() {
super();
// TODO Auto-generated constructor stub
} public long get_id() {
return _id;
} public void set_id(long _id) {
this._id = _id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

版权声明:本文博主原创文章。博客,未经同意不得转载。

Android 它们的定义ContentProvider和ContentObserver充分利用的更多相关文章

  1. java攻城狮之路(Android篇)--ListView与ContentProvider

    一.ListView 1.三种Adapter构建ListView ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种 B ...

  2. android菜鸟学习笔记22----ContentProvider(二)ContentObserver的简单使用

    现在有这样一个应用A通过ContentProvider提供自己的数据给其他应用,应用B通过ContentResolver获取应用A中提供的数据,并将其展示在ListView中,而应用C通过Conten ...

  3. Android 这 13 道 ContentProvider 面试题,你都会了吗?

    前言 作为 Android 的四大组件之一,ContentProvider 可以说是无处不在了. 但是对于我而言,开发过程中看似 ContentProvider 用得很娴熟,却一直没能形成一个完整的体 ...

  4. android四大组件之ContentProvider(一)

    ContentProvider学习笔记 1. ContentProvider基本概念 ContentProvider向我们提供了我们在应用程序之间共享数据的一种机制,虽然采用文件和SharedPref ...

  5. android学习笔记54——ContentProvider

    ContentProvider ContentProvider用于实现数据共享. ContentProvider是不同应用程序之间进行数据交换的标准API,其以某种Uri的形式对外提供数据,允许其他应 ...

  6. Android四大组件之——ContentProvider(一)

    Android四大组件之--ContentProvider(一) 本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblog ...

  7. 【Android】19.3 ContentProvider及安卓进一步封装后的相关类

    分类:C#.Android.VS2015: 创建日期:2016-03-08 一.简介 ContentProvider:内容提供程序. Android的ContentProvider与.NET框架的EF ...

  8. Android四大组件之contentProvider

    Activity,Service,broadcast and Contentprovider android 4 大组件. ContentProvider:使用: public class Image ...

  9. 初学android:四大组件之contentprovider

    一.ContentProvider的概念ContentProvider:为存储和获取数据提供统一的接口.可以在不同的应用程序之间共享数据.Android已经为常见的一些数据提供了默认的ContentP ...

随机推荐

  1. CentOS 7单用户模式修改root密码

    CentOS 7的单用户模式和6.5稍有不同 把ro改成 "rw init=/sysroot/bin/sh". 完成之后按 "Ctrl+x" chroot /s ...

  2. Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)(转)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  3. Cocos2dx3.4 VS2013无法打开包括文件extensions/ExtensionExport.h解决的方法

    本来打算看白鹭引擎的.可是又被叫回来研究新引擎呢,不搞不知道,一搞发现cocos2dx新版本号3.4又有了一些变化. 我查了网上的资源,都没有解决的方法.我如今应该是第一个出这个问题的解决的方法哦.. ...

  4. set echo on/off,set term on/off,set feedback off,set heading off命令(转)

    1.term命令:  当和SPOOL命令联合使用时,可以取消SQLPLUS输出,查询结果仅仅存在于假脱机文件中  set term on:查询结果既显示于假脱机文件中,又在SQLPLUS中显示:  s ...

  5. Python 类继承,__bases__, __mro__, super

    Python是面向对象的编程语言,也支持类继承. >>> class Base: ... pass ... >>> class Derived(Base): ... ...

  6. cpe移植framework后,。解决问题的现有数据库

    最近,该公司的业务需求,原始订单apk的形式CPE.渗透framework层.这被剥离cpe,从事相当长的一段,终于有时间来写博客,记下遇到的问题,未来. 第一个问题是,原来的apk有些事情,移植fr ...

  7. class 添加样式,删,开关 【选择】addClass,removeClass,toggleClass

    <1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>< ...

  8. 京东商城招聘自动调价系统架构师 T4级别

    岗位级别:T4 岗位职责: 1.负责自动调价系统的架构设计 2.负责自动调价的预测.相关性算法设计 3.核心代码编写,代码review 任职要求: 1.熟悉数据挖掘.机器学习理论和算法 2.熟悉海量数 ...

  9. Android 学习资源[转]

    因为一些大家都知道的原因,android很多官方出品的优秀开发资源在国内无法访问. 国内的同行们对此也做出了很多努力,有很多朋友通过各种手段把很多优秀的资源搬运到了国内,为国内android开发者提供 ...

  10. MYSQL高可用(HA)随想

    记得在上一篇文章“Java集群--大型网站是怎样解决多用户高并发访问的”的结尾处本人阐述了数据库的高可用的一种方案----实现主从部署,那么今天,就让我聊聊本人关于数据库的一些所思所想吧! 下面是本人 ...