郑州网站建设公司谷雨,地区门户网站 wap app,东莞大岭山建网站公司,湖南企业电子注册登记网一、使用ContentProvider#xff08;内容提供者#xff09;共享数据 ContentProvider在android中的作用是对外共享数据#xff0c;也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问#xff0c;其他应用可以通过ContentProvider对你应用中的数据进行添删… 一、使用ContentProvider内容提供者共享数据 ContentProvider在android中的作用是对外共享数据也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问其他应用可以通过ContentProvider对你应用中的数据进行添删改查。关于数据共享以前我们学习过文件操作模式知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么这里为何要使用ContentProvider对外共享数据呢是这样的如果采用文件操作模式对外共享数据数据的访问方式会因数据存储的方式而不同导致数据的访问方式无法统一如采用xml文件对外共享数据需要进行xml解析才能读取数据采用sharedpreferences共享数据需要使用sharedpreferences API读取数据。使用ContentProvider对外共享数据的好处是统一了数据的访问方式。 当应用需要通过ContentProvider对外共享数据时第一步需要继承ContentProvider并重写下面方法 public class PersonContentProvider extends ContentProvider{nbsp;nbsp;nbsp; nbsp; nbsp;public boolean onCreate()nbsp;nbsp; nbsp; nbsp;public Uri insert(Uri uri, ContentValues values)nbsp;nbsp; nbsp; nbsp;public int delete(Uri uri, String selection, String[] selectionArgs)nbsp;nbsp; nbsp; nbsp;public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)nbsp;nbsp; nbsp; nbsp;public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)nbsp;nbsp; nbsp; nbsp;public String getType(Uri uri) nbsp;} 第二步需要在AndroidManifest.xml使用provider对该ContentProvider进行配置为了能让其他应用找到该ContentProvider ContentProvider采用了authorities主机名/域名对它进行唯一标识你可以把ContentProvider看作是一个网站想想网站也是提供数据者authorities 就是他的域名 manifest.... application android:icondrawable/icon android:labelstring/app_name provider android:name.PersonContentProvider android:authoritiescom.ljq.providers.personprovider/ /application/manifest 二、Uri介绍 Uri代表了要操作的数据Uri主要包含了两部分信息1》需要操作的ContentProvider 2》对ContentProvider中的什么数据进行操作一个Uri由以下几部分组成 ContentProvider内容提供者的scheme已经由Android所规定 scheme为content://主机名或叫Authority用于唯一标识这个ContentProvider外部调用者可以根据这个标识来找到它。路径path可以用来表示我们要操作的数据路径的构建应根据业务而定如下: 要操作person表中id为10的记录可以构建这样的路径:/person/10 要操作person表中id为10的记录的name字段 person/10/name 要操作person表中的所有记录可以构建这样的路径:/person 要操作xxx表中的记录可以构建这样的路径:/xxx 当然要操作的数据不一定来自数据库也可以是文件、xml或网络等其他存储方式如下: 要操作xml文件中person节点下的name节点可以构建这样的路径/person/name 如果要把一个字符串转换成Uri可以使用Uri类中的parse()方法如下 Uri uri Uri.parse(content://com.ljq.provider.personprovider/person) 三、UriMatcher类使用介绍 因为Uri代表了要操作的数据所以我们经常需要解析Uri并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类分别为UriMatcher和ContentUris 。掌握它们的使用会便于我们的开发工作。UriMatcher类用于匹配Uri它的用法如下 首先第一步把你需要匹配Uri路径全部给注册上如下 //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码 UriMatcher sMatcher new UriMatcher(UriMatcher.NO_MATCH); //如果match()方法匹配content://com.ljq.provider.personprovider/person路径返回匹配码为1 sMatcher.addURI(com.ljq.provider.personprovider, person, 1);//添加需要匹配uri如果匹配就会返回匹配码 //如果match()方法匹配content://com.ljq.provider.personprovider/person/230路径返回匹配码为2 sMatcher.addURI(com.ljq.provider.personprovider, person/#, 2);//#号为通配符 switch (sMatcher.match(Uri.parse(content://com.ljq.provider.personprovider/person/10))) { case 1 break; case 2 break; default://不匹配 break; } 注册完需要匹配的Uri后就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配如果匹配就返回匹配码匹配码是调用addURI()方法传入的第三个参数假设匹配content://com.ljq.provider.personprovider/person路径返回的匹配码为1 四、ContentUris类使用介绍 ContentUris类用于操作Uri路径后面的ID部分它有两个比较实用的方法 withAppendedId(uri, id)用于为路径加上ID部分 Uri uri Uri.parse(content://com.ljq.provider.personprovider/person) Uri resultUri ContentUris.withAppendedId(uri, 10); //生成后的Uri为content://com.ljq.provider.personprovider/person/10 parseId(uri)方法用于从路径中获取ID部分 Uri uri Uri.parse(content://com.ljq.provider.personprovider/person/10) long personid ContentUris.parseId(uri);//获取的结果为:10 五、使用ContentProvider共享数据 ContentProvider类主要方法的作用 public boolean onCreate()该方法在ContentProvider创建后就会被调用Android开机后ContentProvider在其它应用第一次访问它时才会被创建。 public Uri insert(Uri uri, ContentValues values)该方法用于供外部应用往ContentProvider添加数据。 public int delete(Uri uri, String selection, String[] selectionArgs)该方法用于供外部应用从ContentProvider删除数据。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)该方法用于供外部应用更新ContentProvider中的数据。 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)该方法用于供外部应用从ContentProvider中获取数据。 public String getType(Uri uri)该方法用于返回当前Url所代表数据的MIME类型。 如果操作的数据属于集合类型那么MIME类型字符串应该以vnd.android.cursor.dir/开头 例如要得到所有person记录的Uri为content://com.ljq.provider.personprovider/person那么返回的MIME类型字符串应该为vnd.android.cursor.dir/person。 如果要操作的数据属于非集合类型数据那么MIME类型字符串应该以vnd.android.cursor.item/开头 例如得到id为10的person记录Uri为content://com.ljq.provider.personprovider/person/10那么返回的MIME类型字符串为vnd.android.cursor.item/person。 六、使用ContentResolver操作ContentProvider中的数据 当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时可以使用ContentResolver 类来完成要获取ContentResolver 对象可以使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法 public Uri insert(Uri uri, ContentValues values)该方法用于往ContentProvider添加数据。 public int delete(Uri uri, String selection, String[] selectionArgs)该方法用于从ContentProvider删除数据。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)该方法用于更新ContentProvider中的数据。 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)该方法用于从ContentProvider中获取数据。 这些方法的第一个参数为Uri代表要操作的ContentProvider和对其中的什么数据进行操作 假设给定的是Uri.parse(content://com.ljq.providers.personprovider/person/10)那么将会对主机名为com.ljq.providers.personprovider的ContentProvider进行操作操作的数据为person表中id为10的记录。 使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作 ContentResolver resolver getContentResolver(); Uri uri Uri.parse(content://com.ljq.provider.personprovider/person); //添加一条记录 ContentValues values new ContentValues(); values.put(name, linjiqin); values.put(age, 25); resolver.insert(uri, values); //获取person表中所有记录 Cursor cursor resolver.query(uri, null, null, null, personid desc); while(cursor.moveToNext()){ Log.i(ContentTest, personid cursor.getInt(0) ,name cursor.getString(1)); } //把id为1的记录的name字段值更改新为zhangsan ContentValues updateValues new ContentValues(); updateValues.put(name, zhangsan); Uri updateIdUri ContentUris.withAppendedId(uri, 2); resolver.update(updateIdUri, updateValues, null, null); //删除id为2的记录Uri deleteIdUri ContentUris.withAppendedId(uri, 2); resolver.delete(deleteIdUri, null, null); 七、监听ContentProvider中数据的变化 如果ContentProvider的访问者需要知道ContentProvider中的数据发生变化可以在ContentProvider发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者例子如下 public class PersonContentProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues values) { db.insert(person, personid, values); getContext().getContentResolver().notifyChange(uri, null); } } 如果ContentProvider的访问者需要得到数据变化通知必须使用ContentObserver对数据数据采用uri描述进行监听当监听到数据变化通知时系统就会调用ContentObserver的onChange()方法 getContentResolver().registerContentObserver(Uri.parse(content://com.ljq.providers.personprovider/person), true, new PersonObserver(new Handler())); public class PersonObserver extends ContentObserver{ public PersonObserver(Handler handler) { super(handler); } public void onChange(boolean selfChange){ //此处可以进行相应的业务处理 }} } } 转载于:https://blog.51cto.com/xyzlmn/817105