Android四大组件之ContentProvider
来源:互联网 发布:淘宝服装店学生 编辑:程序博客网 时间:2024/05/17 04:25
Android四大组件之一Contentprovider的两大功能
1.进程间通信
2.数据有变化及时通知使用者
这篇文章讲解数据变化时通知使用者的功能,对于及时需要知道数据变化的场景有很大帮助。
文件下载过程, 使用该监听很好实现对ListView列表进行刷新。
这里贴出来刷新UI相关的代码,下载模块,自己实现就ok了,只要数据表中的数据发生变化,就会回调ContentObserver的onChange(...)方法。
初始化BaseAdapter时,注册监听数据表变化的观察者。
public class ListDownloadDocHandler extends BaseAdapter { private DownloadObserver localObserver; private ListDownloadDocHandler listDownloadDocHandler; public ListDocDownloadAdapter(Context context) { localObserver = new DownloadObserver(null, listNonDownloadDocHandler); //注册数据观察者 mContext.getContentResolver().registerContentObserver(ICorporateDocDao.COLUMNS.CONTENT_URI, true, localObserver); } /** *文档全部下载完,取消数据观察者 * */ public void unregisterContentObserver() { mContext.getContentResolver().unregisterContentObserver(localObserver); }static class ListDownloadDocHandler extends Handler { WeakReference<ListDocDownloadAdapter> listDocAdapter; ListDocDownloadAdapter locallistDocAdapter; public ListNonDownloadDocHandler(ListDocNondownloadAdapter listDocAdapter) { this.listDocAdapter = new WeakReference<ListDocDownloadAdapter>(listDocAdapter); } ... ... public void handleMessage(Message msg) { if (listDocAdapter == null) { Logger.d(loggerName, "listDocAdapter is null"); return; } locallistDocAdapter = listDocAdapter.get(); switch (msg.what) { case DownloadKeys.DOWNLOADING_TASK: locallistDocAdapter.uiRefresh(); break; default: break; } } } /** * 实现子类DownloadObserver继承 ContentObserver接口 * */class DownloadObserver extends ContentObserver { private Handler handler; public DownloadObserver(Uri mediaUri, Handler paramHandler) { super(paramHandler); handler = paramHandler; } /** *ICorporateDocDao.COLUMNS.CONTENT_URI数据变化时,回调onChange(...) */ @Override public void onChange(boolean paramBoolean) { super.onChange(paramBoolean); if (dataList == null || dataList.isEmpty()) { Logger.d(loggerName, "dataList is null"); return; } handler.sendEmptyMessage(DownloadKeys.DOWNLOADING_TASK); } }
public class CorporateDocProvider extends ContentProvider { private final String TAG = "CorporateDocProvider"; private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final int MEDIA = 1000; private static final int MEDIA_ID = 1001; static { URI_MATCHER.addURI("com.demo.emm", "media_doc", 1000); URI_MATCHER.addURI("com.demo.emm", "media_doc/#", 1001); } @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri paramUri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder localSQLiteQueryBuilder = new SQLiteQueryBuilder(); int i = URI_MATCHER.match(paramUri); switch (i) { case MEDIA: localSQLiteQueryBuilder.setTables("media_doc"); break; case MEDIA_ID: localSQLiteQueryBuilder.setTables("media_doc"); localSQLiteQueryBuilder.appendWhere("content_id = " + (String)paramUri.getPathSegments().get(1)); break; default: break; } Cursor localCursor = localSQLiteQueryBuilder.query( MDMDatabaseUtils.getInstance(getContext()).openDatabase(), projection, selection, selectionArgs, null, null, sortOrder); if (localCursor != null) { localCursor.setNotificationUri(getContext().getContentResolver(), paramUri); } else { Logger.d(TAG, "localCursor == null"); } return localCursor; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri paramUri, ContentValues values) { SQLiteDatabase localSQLiteDatabase = MDMDatabaseUtils.getInstance(getContext()) .openDatabase(); Uri localUri = null; int i = URI_MATCHER.match(paramUri); try { localSQLiteDatabase.beginTransaction(); switch (i) { case MEDIA: case MEDIA_ID: long l1 = localSQLiteDatabase.insert("media_doc", null, ensureFile(values)); if (l1 > 0) { localSQLiteDatabase.setTransactionSuccessful(); } else { Logger.d(TAG, "insert media_doc data failure" + values.toString()); } if (paramUri != null) { getContext().getContentResolver().notifyChange(paramUri, null); localUri = paramUri; } break; default: throw new UnsupportedOperationException("Invalid URI " + paramUri); } } catch (Exception e) { Logger.d(TAG, e.getMessage()); } finally { if (null != localSQLiteDatabase) { localSQLiteDatabase.endTransaction(); } } return localUri; } @Override public int delete(Uri paramUri, String whereClause, String[] whereArgs) { SQLiteDatabase localSQLiteDatabase = MDMDatabaseUtils.getInstance(getContext()) .openDatabase(); int flag = 0; int i = URI_MATCHER.match(paramUri); try { localSQLiteDatabase.beginTransaction(); switch (i) { case MEDIA_ID: String id = (String)paramUri.getPathSegments().get(1); if (!TextUtils.isEmpty(id)) { String str3 = COLUMNS.CONTENT_ID + " = " + (String)paramUri.getPathSegments().get(1); if (whereClause == null) { whereClause = str3; } else { whereClause = str3 + " AND (" + whereClause + ")"; } } int l1 = localSQLiteDatabase.delete("media_doc", whereClause, whereArgs); if (l1 > 0) { localSQLiteDatabase.setTransactionSuccessful(); } else { Logger.d(TAG, "media_doc delete fail=" + whereClause + "=" + whereArgs.length); } if (paramUri != null) getContext().getContentResolver().notifyChange(paramUri, null); break; case MEDIA: int l2 = localSQLiteDatabase.delete("media_doc", whereClause, whereArgs); if (l2 > 0) { localSQLiteDatabase.setTransactionSuccessful(); } else { Logger.d(TAG, "media_doc delete fail=" + whereClause + "=" + whereArgs.length); } if (paramUri != null) getContext().getContentResolver().notifyChange(paramUri, null); break; default: break; } } catch (Exception e) { Logger.d(TAG, e.getMessage()); } finally { if (null != localSQLiteDatabase) { localSQLiteDatabase.endTransaction(); } } return flag; } @Override public int update(Uri paramUri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase localSQLiteDatabase = MDMDatabaseUtils.getInstance(getContext()) .openDatabase(); int i = URI_MATCHER.match(paramUri); localSQLiteDatabase.beginTransaction(); int index = -1; Uri localUri = null; try { switch (i) { case MEDIA: case MEDIA_ID: int l1 = localSQLiteDatabase.update("media_doc", values, selection, selectionArgs); if (l1 > 0) { localSQLiteDatabase.setTransactionSuccessful(); } else { Logger.d(TAG, "update fail=" + values); } if (paramUri != null) getContext().getContentResolver().notifyChange(paramUri, null); break; default: break; } } catch (Exception e) { Logger.d(TAG, e.getMessage()); } finally { if (null != localSQLiteDatabase) { localSQLiteDatabase.endTransaction(); } } return index; } private ContentValues ensureFile(ContentValues paramContentValues) { return paramContentValues; }}
AndroidManifest.xml配置文件中设置:
<provider android:name="com.polysaas.mdm.dao.impl.CorporateDocProvider" android:authorities="com.demo.emm" > </provider>
0 0
- Android四大组件之ContentProvider
- android四大组件之ContentProvider
- android四大组件之 ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- android 四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- android四大组件之ContentProvider
- android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之~~ContentProvider
- Android 四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- 回调机制
- iOS开发网络篇—文件的上传
- 动态规划与递归非递归
- 贪心 迷障
- BSD协议
- Android四大组件之ContentProvider
- 定义搜索深度,用户变量等
- 也论UIGrid
- Mac OSX 系统下 android studio 停留在Feching Android SDK component information
- JSON格式传递数据使用方法(JS和JAVA)
- mysql 分段统计数据
- ini_set('memory_limit', '128M')、php.ini memory_limit引起的问题详细介绍
- 转载: linux 内存管理 - paging_init 函数
- 一些适合新手的网站与博客