Android - Proveedor de contenido

1. Introducción

ContentProvider se utiliza principalmente para realizar la función de compartir datos entre diferentes aplicaciones. Proporciona un conjunto completo de mecanismos que permiten que un programa acceda a datos en otro programa, al tiempo que garantiza la seguridad de los datos accedidos. Actualmente, el uso de ContentProvider es la forma estándar en que Android comparte datos entre programas. ContentProvider puede elegir qué parte de los datos compartir solo, para garantizar que los datos privados en nuestro programa no tengan riesgo de fuga.

1. Uso básico de ContentResolver

Para cada aplicación, si desea acceder a los datos compartidos en ContentProvider, debe usar la clase ContentResolver y puede obtener una instancia de esta clase a través del método getContentResolver() en Context . ContentResolver proporciona una serie de métodos para agregar, eliminar, modificar y consultar datos. El método insert() se usa para agregar datos, el método update() se usa para actualizar datos, el método delete() se usa para eliminar datos y el método query() Se utiliza para consultar datos. ¿Hay alguna sensación de déjà vu? Así es, estos métodos también se usan en SQLiteDatabase para realizar operaciones de adición, eliminación, modificación y consulta, pero son ligeramente diferentes en los parámetros del método. A diferencia de SQLiteDatabase, los métodos de adición, eliminación, modificación y consulta en ContentResolver no aceptan parámetros de nombre de tabla, sino que utilizan un parámetro Uri, que se denomina URI de contenido. El URI de contenido establece un identificador único para los datos en ContentProvider y consta principalmente de dos partes: autoridad y ruta. La autoridad se usa para distinguir diferentes aplicaciones.Generalmente, para evitar conflictos, se usa el nombre del paquete de la aplicación para nombrar. Por ejemplo, si el nombre del paquete de una aplicación es com.example.app, entonces la autoridad correspondiente a la aplicación puede llamarse com.example.app.provider. ruta se utiliza para distinguir diferentes tablas en la misma aplicación y, por lo general, se agrega después de la autoridad. Por ejemplo, hay dos tablas table1 y table2 en la base de datos de una aplicación. En este momento, puede nombrar las rutas como /table1 y /table2 respectivamente, y luego combinar autoridad y ruta, y el URI de contenido se convierte en com.example. app.proveedor/table1 y com.example.app.provider/table2. Sin embargo, aún es difícil identificar estas dos cadenas como dos URI de contenido.También debemos agregar una declaración de protocolo al encabezado de la cadena. Por lo tanto, el formato más estándar para un URI de contenido es el siguiente:

content://com.example.app.provider/table1 
content://com.example.app.provider/table2

Después de obtener la cadena URI de contenido, debemos analizarla en un objeto Uri antes de pasarla como parámetro. El método de análisis también es bastante simple, el código es el siguiente:

val uri = Uri.parse("content://com.example.app.provider/table1")

2. uso

val cursor = contentResolver.query(
 uri,
 projection,
 selection,
 selectionArgs,
 sortOrder)

 Una vez completada la consulta, aún se devuelve un objeto Cursor y luego podemos leer los datos del objeto Cursor uno por uno. La idea de leer sigue siendo recorrer todas las filas del Cursor moviendo la posición del cursor, y luego buscar los datos de la columna correspondiente en cada fila, el código es el siguiente:

 while (cursor.moveToNext()) { 
    val column1 = cursor.getString(cursor.getColumnIndex("column1")) 
    val column2 = cursor.getInt(cursor.getColumnIndex("column2")) 
} 
cursor.close()

Después de dominar la operación de consulta más difícil, las operaciones restantes de agregar, modificar y eliminar son aún más fáciles. Primero echemos un vistazo a cómo agregar un dato a la tabla 1, el código es el siguiente:

val values = contentValuesOf("column1" to "text", "column2" to 1) contentResolver.insert(uri, values)

Se puede ver que los datos que se agregarán todavía se ensamblan en ContentValues, y luego se llama al método insert () de ContentResolver, y el Uri y ContentValues ​​​​se pasan como parámetros.

Si queremos actualizar estos datos recién agregados y borrar el valor de la columna 1, podemos usar el método update() de ContentResolver. El código es el siguiente:

val values = contentValuesOf("column1" to "") 
contentResolver.update(uri, values, "column1 = ? and column2 = ?", arrayOf("text", "1")) 

Tenga en cuenta que el código anterior usa los parámetros Selection y SelectionArgs para restringir la actualización de los datos y evitar que todas las filas se vean afectadas. Finalmente, puede llamar al método delete() de ContentResolver para eliminar este dato. El código es el siguiente:

contentResolver.delete(uri, "columna2 = ?", arrayOf("1"))

usar

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

class MainActivity : AppCompatActivity() {
 private val contactsList = ArrayList<String>()
 private lateinit var adapter: ArrayAdapter<String>
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_main)
     adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, contactsList)
     contactsView.adapter = adapter
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
     != PackageManager.PERMISSION_GRANTED) {
     ActivityCompat.requestPermissions(this,
     arrayOf(Manifest.permission.READ_CONTACTS), 1)
 } else {
     readContacts()
 }
 }
 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
 grantResults: IntArray) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults)
     when (requestCode) {
     1 -> {
     if (grantResults.isNotEmpty()
     && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     readContacts()
 } else {
     Toast.makeText(this, "You denied the permission",
     Toast.LENGTH_SHORT).show()
 }
 }
 }
 }
 private fun readContacts() {
 // 查询联系人数据
     contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
     null, null, null, null)?.apply {
     while (moveToNext()) {
     // 获取联系人姓名
     val displayName = getString(getColumnIndex(
     ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
     // 获取联系人手机号
     val number = getString(getColumnIndex(
     ContactsContract.CommonDataKinds.Phone.NUMBER))
     contactsList.add("$displayName\n$number")
 }
 adapter.notifyDataSetChanged()
     close()
 }
 }
}

 En segundo lugar, el uso de ContentProvider

class MyProvider : ContentProvider() {
 override fun onCreate(): Boolean {
 return false
 }
 override fun query(uri: Uri, projection: Array<String>?, selection: String?,
 selectionArgs: Array<String>?, sortOrder: String?): Cursor? {
 return null
 }
 override fun insert(uri: Uri, values: ContentValues?): Uri? {
 return null
 }
 override fun update(uri: Uri, values: ContentValues?, selection: String?,
 selectionArgs: Array<String>?): Int {
 return 0
 }
 override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
 return 0
 }
 override fun getType(uri: Uri): String? {
 return null
 }
}

(1) onCreate(). Se llama cuando se inicializa ContentProvider. Por lo general, las operaciones como la creación y actualización de la base de datos se completan aquí. Devolver verdadero indica que la inicialización de ContentProvider se realizó correctamente y devolver falso indica falla.

(2) consulta(). Consulta de datos de ContentProvider. El parámetro uri se usa para determinar qué tabla consultar, el parámetro de proyección se usa para determinar qué columnas consultar, los parámetros selection y selectionArgs se usan para restringir qué filas consultar, el parámetro sortOrder se usa para ordenar los resultados y el los resultados de la consulta se almacenan en el objeto Cursor y se devuelven.

(3) insertar(). Agregue un dato a ContentProvider. El parámetro uri se usa para determinar la tabla que se agregará, y los datos que se agregarán se almacenan en el parámetro de valores. Una vez completada la adición, se devuelve un URI que representa el nuevo registro.

(4) actualizar(). Actualice los datos existentes en ContentProvider. El parámetro uri se usa para determinar los datos en qué tabla actualizar. Los nuevos datos se almacenan en el parámetro de valores. Los parámetros selection y selectionArgs se usan para restringir qué filas actualizar, y se devolverá la cantidad de filas afectadas. como valor de retorno.

(5) eliminar(). Eliminar datos de ContentProvider. El parámetro uri se usa para determinar los datos en qué tabla eliminar, los parámetros selection y selectionArgs se usan para restringir qué filas eliminar, y el número de filas eliminadas se devolverá como valor de retorno.

(6) obtenerTipo(). Devuelve el tipo MIME correspondiente en función del URI del contenido entrante. Se puede ver que muchos métodos tienen el parámetro uri, que también se pasa al llamar al método de adición, eliminación, modificación y consulta de contentresolver. Ahora necesitamos analizar el parámetro uri entrante y analizar la tabla y los datos a los que la persona que llama espera acceder.

Supongo que te gusta

Origin blog.csdn.net/m0_59482482/article/details/129718728
Recomendado
Clasificación