ContentResolver AndroidX IllegalArgumentException 无法为数据库提供空上下文
ContentResolver AndroidX IllegalArgumentException Cannot provide null context for the database
我正在尝试从应用程序 A 的内容提供者获取数据。
内容提供者在应用A中定义如下
<provider
android:name=".db.BDataProvider"
android:authorities="com.example.test.db.provider"
android:exported="true"
android:multiprocess="true"
android:readPermission="android.permission.permRead" />
现在在应用程序 B 中,我正尝试按如下方式读取数据
new Thread(new Runnable() {
@Override
public void run() {
try {
try {
String URL = "content://com.example.test.db.provider/user";
Uri uriObj = Uri.parse(URL);
String[] projection = {""};
String[] selectionArgs = {""};
ContentResolver contentResolver = getContentResolver();
Cursor c = contentResolver.query(uriObj , projection, null, selectionArgs, "name");
if (c.moveToFirst()) {
String str = c.getString(c.getColumnIndex("_id"));
Log.d("", str);
}
} catch (Exception ex) {
ex.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}).start();
在我添加的应用程序 B 的清单中
<uses-permission android:name="android.permission.permRead" />
我在这一行收到以下错误
Cursor c = contentResolver.query(uriObj , projection, null, selectionArgs, "name");
java.lang.IllegalArgumentException: Cannot provide null context for the database.
2020-05-07 23:50:14.030 4294-4402/com.example.test D/ActivityThread: Loading provider com.example.test.db.provider: com.example.test.db.provider.BDataProvider
2020-05-07 23:51:36.017 4294-4402/com.example.test W/System.err: java.lang.IllegalArgumentException: Cannot provide null context for the database.
2020-05-07 23:51:36.019 4294-4402/com.example.test W/System.err: at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:600)
2020-05-07 23:51:36.019 4294-4402/com.example.test W/System.err: at com.example.test.db.BDatabase.getInstance(BDatabase.java:15)
2020-05-07 23:51:36.020 4294-4402/com.example.test W/System.err: at com.example.test.db.BDataProvider.query(BDataProvider.java:42)
2020-05-07 23:51:36.021 4294-4402/com.example.test W/System.err: at android.content.ContentProvider.query(ContentProvider.java:1057)
2020-05-07 23:51:36.021 4294-4402/com.example.test W/System.err: at android.content.ContentProvider.query(ContentProvider.java:1149)
2020-05-07 23:51:36.022 4294-4402/com.example.test W/System.err: at android.content.ContentProvider$Transport.query(ContentProvider.java:241)
2020-05-07 23:51:36.023 4294-4402/com.example.test W/System.err: at android.content.ContentResolver.query(ContentResolver.java:757)
2020-05-07 23:51:36.024 4294-4402/com.example.test W/System.err: at android.content.ContentResolver.query(ContentResolver.java:706)
2020-05-07 23:51:36.025 4294-4402/com.example.test W/System.err: at android.content.ContentResolver.query(ContentResolver.java:664)
2020-05-07 23:51:36.025 4294-4402/com.example.test W/System.err: at com.example.test.ui.MainActivity.run(MainActivity.java:313)
2020-05-07 23:51:36.027 4294-4402/com.example.test W/System.err: at java.lang.Thread.run(Thread.java:764)
现在出现了奇怪的部分,上面的代码在基于 appcompatv7 的项目中有效,但在使用 androidX 依赖项创建的新项目中给出了上述错误。
正如我在问题中提到的,列出的代码适用于 androidX 之前的项目。
我得到了 fix/workaround。
在应用程序 A 中,扩展 RoomDatabase 的数据库 class
我正在使用 context.getApplicationContext()
public static synchronized BDatabase getInstance(Context context) {
if (dbInstance == null) {
dbInstance = Room.databaseBuilder(context.getApplicationContext(), BDatabase .class, DBConstants.DATABASE_NAME).build();
}
return dbInstance;
}
}
将其替换为普通 context 可解决问题。
是的,context.getApplicationContext() 一开始就没有意义。
dbInstance = Room.databaseBuilder(context, BDatabase .class, DBConstants.DATABASE_NAME).build();
我正在尝试从应用程序 A 的内容提供者获取数据。
内容提供者在应用A中定义如下
<provider
android:name=".db.BDataProvider"
android:authorities="com.example.test.db.provider"
android:exported="true"
android:multiprocess="true"
android:readPermission="android.permission.permRead" />
现在在应用程序 B 中,我正尝试按如下方式读取数据
new Thread(new Runnable() {
@Override
public void run() {
try {
try {
String URL = "content://com.example.test.db.provider/user";
Uri uriObj = Uri.parse(URL);
String[] projection = {""};
String[] selectionArgs = {""};
ContentResolver contentResolver = getContentResolver();
Cursor c = contentResolver.query(uriObj , projection, null, selectionArgs, "name");
if (c.moveToFirst()) {
String str = c.getString(c.getColumnIndex("_id"));
Log.d("", str);
}
} catch (Exception ex) {
ex.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}).start();
在我添加的应用程序 B 的清单中
<uses-permission android:name="android.permission.permRead" />
我在这一行收到以下错误
Cursor c = contentResolver.query(uriObj , projection, null, selectionArgs, "name");
java.lang.IllegalArgumentException: Cannot provide null context for the database.
2020-05-07 23:50:14.030 4294-4402/com.example.test D/ActivityThread: Loading provider com.example.test.db.provider: com.example.test.db.provider.BDataProvider
2020-05-07 23:51:36.017 4294-4402/com.example.test W/System.err: java.lang.IllegalArgumentException: Cannot provide null context for the database.
2020-05-07 23:51:36.019 4294-4402/com.example.test W/System.err: at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:600)
2020-05-07 23:51:36.019 4294-4402/com.example.test W/System.err: at com.example.test.db.BDatabase.getInstance(BDatabase.java:15)
2020-05-07 23:51:36.020 4294-4402/com.example.test W/System.err: at com.example.test.db.BDataProvider.query(BDataProvider.java:42)
2020-05-07 23:51:36.021 4294-4402/com.example.test W/System.err: at android.content.ContentProvider.query(ContentProvider.java:1057)
2020-05-07 23:51:36.021 4294-4402/com.example.test W/System.err: at android.content.ContentProvider.query(ContentProvider.java:1149)
2020-05-07 23:51:36.022 4294-4402/com.example.test W/System.err: at android.content.ContentProvider$Transport.query(ContentProvider.java:241)
2020-05-07 23:51:36.023 4294-4402/com.example.test W/System.err: at android.content.ContentResolver.query(ContentResolver.java:757)
2020-05-07 23:51:36.024 4294-4402/com.example.test W/System.err: at android.content.ContentResolver.query(ContentResolver.java:706)
2020-05-07 23:51:36.025 4294-4402/com.example.test W/System.err: at android.content.ContentResolver.query(ContentResolver.java:664)
2020-05-07 23:51:36.025 4294-4402/com.example.test W/System.err: at com.example.test.ui.MainActivity.run(MainActivity.java:313)
2020-05-07 23:51:36.027 4294-4402/com.example.test W/System.err: at java.lang.Thread.run(Thread.java:764)
现在出现了奇怪的部分,上面的代码在基于 appcompatv7 的项目中有效,但在使用 androidX 依赖项创建的新项目中给出了上述错误。
正如我在问题中提到的,列出的代码适用于 androidX 之前的项目。
我得到了 fix/workaround。
在应用程序 A 中,扩展 RoomDatabase 的数据库 class 我正在使用 context.getApplicationContext()
public static synchronized BDatabase getInstance(Context context) {
if (dbInstance == null) {
dbInstance = Room.databaseBuilder(context.getApplicationContext(), BDatabase .class, DBConstants.DATABASE_NAME).build();
}
return dbInstance;
}
}
将其替换为普通 context 可解决问题。 是的,context.getApplicationContext() 一开始就没有意义。
dbInstance = Room.databaseBuilder(context, BDatabase .class, DBConstants.DATABASE_NAME).build();