ContentProvider
Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。所以我们可以在其他应用程通过那些ContentProvider获取这些数据。
写法步骤:
首先在需要提供数据的应用中自定义一个ContentProvider类,继承自ContentProvider。
重写onCreate(),query(),delete(),update(),insert(),getType()方法。
然后在应用的清单文件中添加配置:
<provider android:authorities="dozz.provider" android:name=".provider.MyContentProvider" android:exported="true" ></provider>
Authorities 名称随便写,但是自己要记住。
Name:和Activity一样,是自定义ContentProvider的路径和名字。
Exported 是否暴露数据,写true。
在自定义ContentProvider中首先初始化几个参数和写静态代码块:
public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); MySQLiteHelper mySQLiteHelper; SQLiteDatabase database; /**参数: * String authority xml中定义的属性 * String path 方法的标记 * int code 匹配后返回的值 除了-1都可以 * * uri匹配器 dozz.provider / query * */ static{ uriMatcher.addURI("dozz.provider","query",0); } @Override public boolean onCreate() { mySQLiteHelper = new MySQLiteHelper(getContext()); //拿到数据库 database = mySQLiteHelper.getWritableDatabase(); return false; } /**uri:方法的匹配-- * projection:列名 * selection查询条件 * selectionArgs查询条件的值 * sortOrder排序*/ @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //成功 if (uriMatcher.match(uri) == 0){ Cursor cursor = database.query("demo_one",projection,selection,selectionArgs,null,null,sortOrder); return cursor; }else {//失败 return null; } } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { if (uriMatcher.match(uri) == 1){ long code = database.insert("demo_one",null,values); Log.d("MyContentProvider","code:"+code); Uri uri1 = Uri.parse("dozz.provider/insert"); }else{ } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; }
在另一个应用中要初始化一个ContentResolver contentResovler= getContentResolver();
增删改查的动作中,定义uri,注意:要和ContentProvider类的动作一致,比如删除:
public void delete(View view){ uri = Uri.parse("content://dozz.provider/delete"); contentResolver.delete(uri,"username=?",new String[]{"2"}); Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show(); }
随后调用contentProvider的增删改查方法传入参数执行。
写法和SqliteDatabase 的封装的增删改查方法差不多,注意第一个参数永远是uri。