Android之ContentProvider共享数据
yeoj3133
8年前
<ul> <li> <p><strong>什么是ContentProvider</strong></p> <p>是所有应用程序之间数据存储和检索的桥梁</p> <p>作用:将应用程序的私有数据向外提供一个访问的接口, 是基于URI的格式 ,向外提供数据访问的接口</p> <p>ContentProvider 内容提供者 负责暴露数据 相当于服务器</p> <p>ContentResolver 内容解析者 负责解析ContentProvider暴露的数据 相当于客户端</p> </li> <li> <p><strong>自定义ContentProvider</strong></p> <p>1.定义一个类继承ContentProvider,重写父类的六个方法</p> <pre> <code class="language-java">boolean onCreate() //初始化Provider Uri insert(Uri uri,ContentValues values)//插入新数据 int delete(Uri uri, String selection, String[] selectionArgs)//删除数据 int update(Uri uri,ContentValues values, String selection, String[] selectionArgs)//更新已存在数据 Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs,String sortOrder) //返回数据给调用者 String getType(Uri uri) //返回ContentProvider的mime数据</code></pre> <p>2.声明ContentProvider的唯一标识(小写字母,建议:包名+数据库名)</p> <p>3.声明访问数据库的Code码(是在CotentProvider暴露数据时使用)</p> <p>4.定义Uri的匹配器UriMatcher,并且实例化(其他应用程序在通过ContentResolver执行CURD操作时,都需要一个重要的参数Uri,为了顺利提供这个Uri参数,Android系统提供了一个UriMatcher工具类)</p> <pre> <code class="language-java">private static UriMatcher uriMatcher ; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.add("唯一标识","路径(建议: 表名)",当前Uri对应的数据库的code码); }</code></pre> <p>5.定义一个数据库的帮助类(SQLiteOpenHelper),并在onCreate() 方法中完成数据表的初始</p> <p>6.在相应的增 删 改 查 方法中, 通过Uri匹配器, 判断当前用户传入的Uri到底是操作那张表的code</p> <p>7.在清单文件中注册ContentProvider</p> <pre> <code class="language-java"><provider android:name="" 说明注册的是哪个CotentProvider (全类名) android:authorities="" 与CotentProvider中的 唯一标识完全一致 android:exported="" 声明当前应用程序 可以被外部的应用程序访问 /></code></pre> </li> <li> <p><strong>注意:</strong></p> <p>ContentProvider是单例模式的,当多个应用程序通过使用ContentResolver来操作使用ContentProvider提供的数据时,ContentResolver调用的数据操作会委托给同一个ContentProvider来处理,这样就能保证数据的一致性。</p> </li> <li> <p><strong>实例:</strong></p> <pre> <code class="language-java">public class UserContentProvider extends ContentProvider { private DbOpenHelper dbOpenHelper; //2, 声明ContentProvider组件的唯一表示, 必须是小写的字母 //建议: 应用程序的包名+标识资源的名称 (数据库的名称) private static final String AUTHORITY = "com.qf.day16_contentprovider_04.qf"; //3, 声明访问数据库中的那些表的code private static final int CODE_USER = 0; private static final int CODE_ORDER = 5; //4, 声明Uri的匹配器, 实例化 private static UriMatcher uriMatcher; static{ //匹配码 UriMatcher.NO_MATCH : 不匹配任何的Uri uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //注册的Uri /** * authority CotentProvider 的唯一表示 * path 路径(建议为表名,但是不一定) * code 当前url的匹配码 */ //content://com.qf.day16_contentprovider_04.qf/t_user uriMatcher.addURI(AUTHORITY, "t_user", CODE_USER);//URI //content://com.qf.day16_contentprovider_04.qf/t_order uriMatcher.addURI(AUTHORITY, "t_order", CODE_ORDER); } @Override public boolean onCreate() { // 初始化的工作 //getContext() 得到上下文对象 dbOpenHelper = new DbOpenHelper(getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 查询数据 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); Cursor curson = null; //通过Uri的匹配器, 判断当前的Uri访问的是那张表 switch (uriMatcher.match(uri)) { case CODE_USER: curson = db.query("t_user", projection, selection, selectionArgs, null, null, sortOrder); break; case CODE_ORDER: curson = db.query("t_order", projection, selection, selectionArgs, null, null, sortOrder); break; } return curson; } @Override public Uri insert(Uri uri, ContentValues values) { // 插入数据 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); long id = 0 ; if(uriMatcher.match(uri)==CODE_USER) { //向数据库中插入数据后, 返回当前插入数据的id id = db.insert("t_user", null, values); //生成最新的URI 并返回(旧的Uri + id) //content://com.qf.day16_contentprovider_04.qf/t_user/7 return ContentUris.withAppendedId(uri, id); } if(uriMatcher.match(uri) == CODE_ORDER) { id = db.insert("t_order", null, values); return ContentUris.withAppendedId(uri, id); } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 删除数据 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int count = 0; if(uriMatcher.match(uri) == CODE_USER) { count = db.delete("t_user", selection, selectionArgs); } return count; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // 修改数据 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int count = 0; if(uriMatcher.match(uri) == CODE_USER) { count = db.update("t_user", values, selection, selectionArgs); } return count; } @Override public String getType(Uri uri) { // TODO 只实现, 不处理 return null; } }</code></pre> </li> </ul> <p> </p> <p>来自:http://www.jianshu.com/p/0fb3c989dab6</p> <p> </p>