Search code examples
androidandroid-contentproviderandroidx

ContentResolver AndroidX IllegalArgumentException Cannot provide null context for the database


I'm trying to fetch data from the content provider of application A.

The content provider is defined as follows in application A

    <provider
        android:name=".db.BDataProvider"
        android:authorities="com.example.test.db.provider"
        android:exported="true"
        android:multiprocess="true"
        android:readPermission="android.permission.permRead" />

Now in application B i'm trying to read the data as follows

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

In the manifest of application B I've added

 <uses-permission android:name="android.permission.permRead" />

I get the following error at this line

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$2.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)

Now comes the weird part, the above code works in the project which is appcompatv7 based but gives be the above error in the new project created with androidX dependencies.


Solution

  • As I mentioned in the question the listed code works in pre-androidX projects.

    I was able to get a fix/workaround.

    In application A, the Database class which extends RoomDatabase I was using 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;
        }
    }
    

    replacing it to plain context fixes the issue. Yes, context.getApplicationContext() didnt make sense in the first place.

    dbInstance = Room.databaseBuilder(context, BDatabase .class, DBConstants.DATABASE_NAME).build();
    

    https://stackoverflow.com/a/55743967/3518278