我已经阅读了很多关于内容提供商的答案,但我无法理解为什么我的客户没有收到存储在数据库中的任何数据。
- 我到处都使用相同的uri。
- 我已在清单中的提供程序中添加了读写权限。
- 我已导出提供程序并将多进程设置为" true"太
- 我的应用程序中的客户端具有相同的读写权限。
- 我在app中为我的客户端创建了一个包含解析器的jar。我已将其添加为库。
- 我知道参数进入数据库,因为我可以看到数据库中的所有信息。
- 在我完成上述所有操作之前,我的客户端无法连接到提供商,因为我修复了有关它的异常。
现在一切都应该工作,不再崩溃,但我从解析器获得的所有字符串都是空的。我不知道它是否真的与提供商有关,或者是否有其他不正确之处。 请帮我! 问:提供者声明中的权限字符串和权限字符串是否必须与包结构匹配?
以下是一些代码: 清单中的提供者声明:
<provider
android:name=".lessons.LessonsProvider"
android:authorities="com.scheduler.lessons"
android:readPermission="com.lessons.READ_DATABASE"
android:writePermission="com.lessons.WRITE_DATABASE"
android:multiprocess="true"
android:exported="true" />
解析器代码: 公共课LessonsResolver {
private static final String TAG = "LessonProvider";
private final String PROVIDER_NAME = "com.scheduler.lessons";
private Uri uri;
private Context mContext;
public LessonsResolver(Context context) {
super();
mContext = context;
uri = Uri.parse("content://"+ PROVIDER_NAME+"/parameters_table");
}
public String getString(String parameterName, String defaultValue) {
Cursor cursor = mContext.getContentResolver().query(uri, null, "parameter_name='"+parameterName+"'", null, null);
if (cursor == null || cursor.getCount() == 0) {
Log.e(TAG,"getString: for parameterName: " + parameterName + ", cursor from the content provider "+ (cursor == null ? "is NULL" : "is empty" ));
cursor.close();
return defaultValue;
}
cursor.moveToFirst();
String s = cursor.getString(2);
cursor.close();
return s;
}
客户端应用清单中的权限:
<uses-permission android:name="com.lessons.READ_DATABASE"/>
<uses-permission android:name="com.lessons.WRITE_DATABASE"/>
我的提供者:
public class LessonsProvider extends ContentProvider {
public static final String PROVIDER_NAME = "com.scheduler.lessons";
private static final String TABLE_NAME = "lessons";
private static final String TAG = "LessonsProvider";
private static final Uri CONTENT_URI = Uri.parse("content://"+PROVIDER_NAME + "/parameters_table");
...
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
sqlBuilder.setTables(TABLE_NAME);
Cursor c = sqlBuilder.query(mSqlDB, projection, selection, selectionArgs, null, null, null);
return c;
}