ContentProvider的简单实现 + ContentObserver加听数据库
来源:互联网 发布:国家税务局网络 编辑:程序博客网 时间:2024/05/29 15:46
有时候我们需要动态的刷新页面,比如收到短信的时候,短信页面动态刷新,显示最新的短信状态。
一般我们会采用监听数据库的方法来实现,但是监听数据库要有uri,也就是要tigongContentProvider才行。
这里就是一个简单里的例子,输入姓名,点插入按钮就会插入数据,然后动态更新下面的TextView,点击删除按钮也会更新TextView。
不多说了,让代码来说话。
DBInfo.java:
public class DBInfo implements BaseColumns{private DBInfo() {}public static final String AUTHORITY = "droid.provider.mycontentprovider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/my_tbl"); public static final String CONTENT_TYPE = "vnd.Android.cursor.dir/vnd.droid.my_tbl"; public static final String CONTENT_ITEM_TYPE = "vnd.Android.cursor.item/vnd.droid.my_tbl"; public static final String TABLE_NAME = "my_tbl"; public static final int VERSION = 1; public static final String NAME = "name"; }
DatabaseHelper.java:
public class DatabaseHelper extends SQLiteOpenHelper {public static String DATABASE_NAME = "mydatabase.db";public static int version = 1;public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, version);}@Overridepublic void onOpen(SQLiteDatabase db) {super.onOpen(db);}@Overridepublic void onCreate(SQLiteDatabase db) {String s = "CREATE TABLE " + DBInfo.TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)";db.execSQL(s);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS notes");onCreate(db);}}
上面两个类定义了一些数据库的结构,和一些常量等。
下面是ContentProvider(没有实现完全,只是先部分方法):
public class MyContentProvider extends ContentProvider {private static final int ALL_ROWS = 1;private static final int SINGLE_ROW = 2;private static UriMatcher uriMatcher = null;private DatabaseHelper dbHelper = null;static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(DBInfo.AUTHORITY, "my_tbl", ALL_ROWS);uriMatcher.addURI(DBInfo.AUTHORITY, "my_tbl/#", SINGLE_ROW);}@Overridepublic boolean onCreate() {System.out.println("MyContentProvider ---> onCreate()");dbHelper = new DatabaseHelper(getContext());return false;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = dbHelper.getWritableDatabase();int resultCode = db.delete(DBInfo.TABLE_NAME, selection, selectionArgs);getContext().getContentResolver().notifyChange(uri, null);return resultCode;}@Overridepublic String getType(Uri uri) {switch (uriMatcher.match(uri)) {case ALL_ROWS:return DBInfo.CONTENT_TYPE;case SINGLE_ROW:return DBInfo.CONTENT_ITEM_TYPE;default:throw new IllegalArgumentException("Unknown URI: " + uri);}}@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.insert(DBInfo.TABLE_NAME, null, values);getContext().getContentResolver().notifyChange(uri, null);return null;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.query(DBInfo.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);return cursor;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}}
Activity:
public class Activity01 extends Activity {private static final int INSERT_TAG = 1;private static final int DELETE_TAG = 2;private Uri uri = Uri.parse("content://droid.provider.mycontentprovider/my_tbl");private EditText name_input;private Button insertBtn;private Button deleteBtn;private TextView display;private MyObserver observer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name_input = (EditText) findViewById(R.id.name_input); insertBtn = (Button) findViewById(R.id.insertBtn); deleteBtn = (Button) findViewById(R.id.deleteBtn); insertBtn.setOnClickListener(new ButtonListener()); deleteBtn.setOnClickListener(new ButtonListener()); insertBtn.setTag(INSERT_TAG); deleteBtn.setTag(DELETE_TAG); display = (TextView) findViewById(R.id.display); observer = new MyObserver(new Handler());this.getContentResolver().registerContentObserver(uri, true, observer);query(); } private class ButtonListener implements OnClickListener {@Overridepublic void onClick(View v) {int tag = (Integer) v.getTag();switch(tag) {case INSERT_TAG:insert();break;case DELETE_TAG:delete();break;}} } private void insert() { ContentValues cv = new ContentValues(); String nameStr = name_input.getText().toString(); if(nameStr == null || "".equals(nameStr)) { return; } cv.put("name", nameStr); this.getContentResolver().insert(uri, cv); } private void delete() { String nameStr = name_input.getText().toString(); int i = this.getContentResolver().delete(uri, "name=?", new String[]{nameStr}); System.out.println("--- delete() i--->" + i); } private void query() { String[] projection = {"_id", "name"}; StringBuffer sb = new StringBuffer();; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if(cursor != null && cursor.getCount() > 0) { cursor.moveToFirst(); for(int i=0; i<cursor.getCount(); i++) { cursor.moveToPosition(i); String id = cursor.getString(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); sb.append("id: " + id + " ; name: " + name + "\n"); } } display.setText(sb.toString()); sb.delete(0, sb.length()); } public class MyObserver extends ContentObserver {public MyObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);System.out.println(" ----- MyObserver -----> onChange() --- selfChange: " + selfChange);query();} } }
一定记得,contentProvider要在配置文件中声明:
<provider android:authorities="droid.provider.mycontentprovider"android:name=".MyContentProvider" />
布局很简单,这里就不在贴布局文件了。ContentProvider提供的不够完整。
- ContentProvider的简单实现 + ContentObserver加听数据库
- Android ContentProvider和ContentObserver 监控数据库变化 简单使用说明
- ContentObserver实现数据库的监听
- ContentProvider 的简单实现
- Android ContentObserver简单实现
- contentProvider简单实现数据库的增删改查
- Android ContentProvider、ContentResolver和ContentObserver的使用
- Android ContentObserver实现数据库监听
- ContentProvider、ContentValues、ContentResolver、ContentObserver
- ContentProvider & ContentResolver & ContentObserver
- ContentProvider ,ContentObserver 和ContentResolver
- 使用ContentObserver监听ContentProvider中数据的变化
- 自定义ContentProvider以及ContentObserver的使用完整详细示例
- Android 自定义ContentProvider和ContentObserver的完整使用
- 自定义ContentProvider以及ContentObserver的使用完整详细示例
- 内容提供者ContentProvider和内容观察者ContentObserver的使用
- android原生的数据库实现(ContentProvider+SQLiteOpenHelper)
- Android ContentProvider简单实现
- IEnumerable IListIList,ICollection,IEnumerable
- poj 2773 Happy 2006
- 用PHP实现mysql锁表
- ActiveX控件的MFC设计之旅-第3步 .
- Process::Start( String::Concat(pstrStartupPathOn , patrOnlineExe) );
- ContentProvider的简单实现 + ContentObserver加听数据库
- ActiveX控件的MFC设计之旅-第4步
- android AIDL的基本知识
- ActiveX控件的MFC设计之旅-第5步 .
- 谈谈数据加密的处理--提供各种算法处理
- 动态添加的ActiveX控件如何响应事件 .
- ActiveX控件中全局变量的一种用法 .
- Eclipse快捷键大全(转载)
- OPC向UNIX的演进(OPC evolution toward UNIX)