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();