从提供的代码中可以看出,DatabaseProvider是一个继承自ContentProvider的类,用于提供对数据库的增删改查操作。但是,根据代码中的逻辑,确实无法实现数据的共享。

原因是在onCreate()方法中,虽然创建了一个MyDatabaseHelper对象,但是该对象的作用域仅限于当前的ContentProvider实例中。也就是说,每次调用ContentProvider的方法时,都会创建一个新的MyDatabaseHelper对象。

要实现数据库的共享,可以通过将MyDatabaseHelper对象的创建和管理放在Application类中,或者使用单例模式来确保只有一个MyDatabaseHelper对象被创建和共享。然后,从ContentProvider中获取到Application对象,从而获取到MyDatabaseHelper对象,以实现对数据库的操作。

同时,还需要在AndroidManifest.xml文件中注册ContentProvider,并设置'android:authorities'属性来指定内容URI的权限,以便其他应用程序可以访问该ContentProvider提供的数据。

以下是修改后的示例代码:

class DatabaseProvider : ContentProvider() {
    private val bookDir = 0
    private val bookItem = 1
    private val categoryDir = 2
    private val categoryItem = 3
    private val authority = 'com.example.databasetest1.provider'
    private var dbHelper: MyDatabaseHelper? = null

    private val uriMatcher by lazy {
        val matcher = UriMatcher(UriMatcher.NO_MATCH)
        matcher.addURI(authority, 'book', bookDir)
        matcher.addURI(authority, 'book/#', bookItem)
        matcher.addURI(authority, 'category', categoryDir)
        matcher.addURI(authority, 'category/#', categoryItem)
        matcher
    }

    override fun onCreate(): Boolean {
        context?.let {
            dbHelper = (it.applicationContext as MyApplication).getDatabaseHelper()
            return true
        }
        return false
    }
    
    // 其他方法的实现与原来的代码相同
}

在MyApplication类中创建并管理MyDatabaseHelper对象:

class MyApplication : Application() {
    private var dbHelper: MyDatabaseHelper? = null

    override fun onCreate() {
        super.onCreate()
        dbHelper = MyDatabaseHelper(this, 'BookStore.db', 2)
    }

    fun getDatabaseHelper(): MyDatabaseHelper {
        return dbHelper!!
    }
}

在AndroidManifest.xml文件中注册ContentProvider:

<application
    ...
    android:name=".MyApplication"
    ...>

    <provider
        android:name=".DatabaseProvider"
        android:authorities="com.example.databasetest1.provider"
        android:exported="true" />

    ...
</application>

这样,就可以实现对数据库的共享访问了。

Android ContentProvider 数据库共享实现 - 详细教程

原文地址: https://www.cveoy.top/t/topic/qhLH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录