class DiaryDatabaseHelper(context: Context) : SQLiteOpenHelper(context, "DiaryDB", null, 1) {
override fun onCreate(db: SQLiteDatabase) { val createTableSQL = """ CREATE TABLE diary ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, date INTEGER, content TEXT ) """.trimIndent() db.execSQL(createTableSQL) }
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { db.execSQL("DROP TABLE IF EXISTS diary") onCreate(db) } }
companion object { const val AUTHORITY = "com.example.providerdemo.diaryprovider" const val TABLE_DIARY = "diary" val CONTENT_URI: Uri = Uri.parse("content://$AUTHORITY/$TABLE_DIARY") const val DIARY_DIR = 1 const val DIARY_ITEM = 2 }
private lateinit var dbHelper: DiaryDatabaseHelper private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply { addURI(AUTHORITY, TABLE_DIARY, DIARY_DIR) /*DIARY_Dir是一个整数值,用来标识这个 URI 模式对应的操作。在后面的 ContentProvider 中,我们会使用这个整数值来确定执行哪些操作(例如查询、插入、更新、删除等)。DIARY_1Dir 是你在代码中定义的常量。比如后面的return when (uriMatcher.match(uri)) { DIARY_DIR ->...}*/ addURI(AUTHORITY, "$TABLE_DIARY/#", DIARY_ITEM)
//构造 content:// 开头的 Uri,它用于标识数据库中的某条数据。 val uri = Uri.parse("content://com.example.providerdemo.diaryprovider/diary") val projection = arrayOf("id", "title", "date", "content") val selection = "title LIKE ?" val selectionArgs = arrayOf("%心情%") val sortOrder = "date DESC"
// 查询操作 val cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder) cursor?.use { while (it.moveToNext()) { val id = it.getInt(it.getColumnIndexOrThrow("id")) val title = it.getString(it.getColumnIndexOrThrow("title")) val date = it.getLong(it.getColumnIndexOrThrow("date")) val content = it.getString(it.getColumnIndexOrThrow("content")) println("ID: $id, Title: $title, Date: $date, Content: $content") } }
4. 总结
通过结合 SQLite 数据库、ContentProvider、ContentResolver 和 UriMatcher,我们可以实现一个完整的跨应用数据共享机制。ContentProvider 作为数据提供者,向外部应用提供访问接口,ContentResolver 则充当请求者的角色,发起查询、插入、更新和删除等操作,UriMatcher 则帮助我们根据 URI 匹配具体的数据操作。