在 Android 的多用户应用程序中访问 SQLite DB

问题描述 投票:0回答:0

我需要通过前台用户从其他服务访问系统用户创建的数据库。这两种服务都是同一个应用程序的一部分。

创建了一个系统服务,它创建了一个数据库并通过 ContentProvider 公开它。在另一个应用程序中,前台用户尝试通过 ContentResolver 访问它。

添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

清单声明

<service
android:name=".EXDBService"
android:enabled="true"
android:singleUser="true"
android:exported="true" />

<service
android:name=".EXService"
android:enabled="true"
android:exported="true"
android:permission="com.example.EX_SERVICE" />
<provider
android:name=".EXDBMananger"
android:authorities="com.example.provider"
android:exported="true"
android:readPermission="com.example.provider.READ_DATABASE"
android:writePermission="com.example.provider.WRITE_DATABASE" />

但是当使用 Contentresolver 发出插入/更新等请求时,它会抛出无法打开数据库的错误。

ContentResolver resolver = getContentResolver();
Uri uri = DbContract.BASE_CONTENT_URI;
// initiate contentValues with valid data
Cursor cursor = resolver.insert(uri, contentValues);

希望我能在这里分享更多的代码,但是有什么猜测会导致这个问题吗?

我看到用户 id 11 试图访问在用户 0 上运行的其他应用程序上的数据库。这会导致任何权限问题吗?

2023-04-20 21:01:48.745 8530-8530/com.example.xxxxx E/SQLiteDatabase: Failed to open database '/data/data/com.example.xxxxx/databases/My.DB'.
    android.database.sqlite.SQLiteCantOpenDatabaseException: Cannot open database '/data/data/com.example.xxxxx/databases/MY.DB': Directory /data/data/com.example.xxxxx/databases doesn't exist
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:254)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:205)
        at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:505)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:206)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:198)
        at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:919)
        at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:899)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:763)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:752)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:383)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:340)
java android android-sqlite android-contentprovider android-contentresolver
© www.soinside.com 2019 - 2024. All rights reserved.