Android ContentProvider 数据库共享实现 - 详细教程
从提供的代码中可以看出,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>
这样,就可以实现对数据库的共享访问了。
原文地址: https://www.cveoy.top/t/topic/qhLH 著作权归作者所有。请勿转载和采集!