问题描述
我有 App A,它在 ContentProvider
的帮助下与 App B 共享其数据库。
这两个应用的 gradle 中都有 Sdk 版本 28。
App A 的清单
<permission android:name="com.example.mldemo.READ_DATABASE" android:protectionLevel="normal" />
<permission android:name="com.example.mldemo.WRITE_DATABASE" android:protectionLevel="normal" />
....
<application
...
<provider android:name=".content_providers.MLProvider"
android:authorities="com.example.mldemo"
android:enabled="true"
android:exported="true"
android:readPermission="com.example.mldemo.READ_DATABASE"
android:writePermission="com.example.mldemo.WRITE_DATABASE"/>
App B 的清单
<uses-permission android:name="com.example.mldemo.READ_DATABASE" />
<uses-permission android:name="com.example.mldemo.WRITE_DATABASE" />
App B 像这样使用 ContentProvider
:
private static final String AUTHORITY = "com.example.mldemo";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/");
....
Uri uri = Uri.parse(CONTENT_URI + "/CONTACTS");
ContentValues newValues = new ContentValues();
newValues.put("NAME",contact.getName());
...
newUri = context.getApplicationContext().getContentResolver().insert(
uri,newValues
);
当我QUERY
contentProvider
时,它工作正常。
当我 insert
时会出现问题。我一直有这个错误:
Failed to find provider null for user 0; expected to find a valid ContentProvider for this authority
解决方法
我找到了解决方案。 在ContentProvider中做insert时,调用notifyChange时需要传递权限:
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/");
...
Uri _uri = ContentUris.withAppendedId(Uri.parse(CONTENT_URI + TABLE_NAME),newId);
getContext().getContentResolver().notifyChange(_uri,null);