Android - provedor de conteúdo

1. Introdução

ContentProvider é usado principalmente para realizar a função de compartilhamento de dados entre diferentes aplicativos.Ele fornece um conjunto completo de mecanismos que permitem que um programa acesse dados em outro programa, garantindo a segurança dos dados acessados. Atualmente, o uso do ContentProvider é a maneira padrão do Android compartilhar dados entre programas. O ContentProvider pode escolher qual parte dos dados compartilhar apenas, para garantir que os dados privados em nosso programa não corram o risco de vazamento.

1. Uso básico do ContentResolver

Para cada aplicação, se você quiser acessar os dados compartilhados no ContentProvider, você deve usar a classe ContentResolver, e você pode obter uma instância desta classe através do método getContentResolver() no Context . ContentResolver fornece uma série de métodos para adicionar, excluir, modificar e consultar dados. O método insert() é usado para adicionar dados, o método update() é usado para atualizar dados, o método delete() é usado para excluir dados e o método query() Usado para consultar dados. Existe alguma sensação de déjà vu? Isso mesmo, esses métodos também são usados ​​no SQLiteDatabase para executar operações de adição, exclusão, modificação e consulta, mas são um pouco diferentes nos parâmetros do método. Ao contrário do SQLiteDatabase, os métodos de adição, exclusão, modificação e consulta no ContentResolver não aceitam parâmetros de nome de tabela, mas usam um parâmetro Uri, chamado de URI de conteúdo. O URI de conteúdo estabelece um identificador exclusivo para os dados no ContentProvider e consiste principalmente em duas partes: autoridade e caminho. A autoridade é usada para distinguir diferentes aplicativos.Geralmente, para evitar conflitos, o nome do pacote do aplicativo é usado para nomenclatura. Por exemplo, se o nome do pacote de um aplicativo for com.example.app, a autoridade correspondente ao aplicativo poderá ser denominada com.example.app.provider. path é usado para distinguir diferentes tabelas no mesmo aplicativo e geralmente é adicionado após a autoridade. Por exemplo, existem duas tabelas table1 e table2 no banco de dados de um aplicativo. Neste momento, você pode nomear os caminhos como /table1 e /table2 respectivamente e, em seguida, combinar autoridade e caminho, e o URI de conteúdo se torna com.example. app.provider/table1 e com.example.app.provider/table2. No entanto, ainda é difícil identificar essas duas strings como dois URIs de conteúdo. Também precisamos adicionar uma declaração de protocolo ao início da string. Portanto, o formato mais padrão para um URI de conteúdo é o seguinte:

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

Depois de obter a string URI de conteúdo, precisamos analisá-la em um objeto Uri antes de passá-la como um parâmetro. O método de análise também é bastante simples, o código é o seguinte:

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

2. usar

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

 Após a conclusão da consulta, um objeto Cursor ainda é retornado e, em seguida, podemos ler os dados do objeto Cursor um por um. A ideia da leitura ainda é percorrer todas as linhas do Cursor movendo a posição do cursor, e depois buscar os dados da coluna correspondente em cada linha, o código é o seguinte:

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

Depois de dominar a operação de consulta mais difícil, as operações restantes de adição, modificação e exclusão são ainda mais fáceis. Vamos primeiro dar uma olhada em como adicionar um dado à tabela1, o código é o seguinte:

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

Pode-se observar que os dados a serem adicionados ainda estão montados em ContentValues, e então o método insert() do ContentResolver é chamado, e o Uri e o ContentValues ​​são passados ​​como parâmetros.

Se quisermos atualizar esses dados adicionados recentemente e limpar o valor da coluna1, podemos usar o método update() do ContentResolver. O código é o seguinte:

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

Observe que o código acima usa os parâmetros selection e selectionArgs para restringir os dados a serem atualizados para evitar que todas as linhas sejam afetadas. Por fim, você pode chamar o método delete() do ContentResolver para excluir esse dado. O código é o seguinte:

contentResolver.delete(uri, "coluna2 = ?", 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()
 }
 }
}

 Em segundo lugar, o 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(). Chamado quando o ContentProvider é inicializado. Normalmente, operações como criar e atualizar o banco de dados são concluídas aqui. Retornar true indica que a inicialização do ContentProvider foi bem-sucedida e retornar false indica falha.

(2) consulta(). Consultar dados do ContentProvider. O parâmetro uri é usado para determinar qual tabela consultar, o parâmetro de projeção é usado para determinar quais colunas consultar, os parâmetros selection e selectionArgs são usados ​​para restringir quais linhas consultar, o parâmetro sortOrder é usado para classificar os resultados e o parâmetro os resultados da consulta são armazenados no objeto Cursor e retornados.

(3) inserir(). Adicione uma parte dos dados a ContentProvider. O parâmetro uri é usado para determinar a tabela a ser adicionada, e os dados a serem adicionados são armazenados no parâmetro values. Após a conclusão da adição, um URI representando o novo registro é retornado.

(4) atualização(). Atualize os dados existentes no ContentProvider. O parâmetro uri é usado para determinar os dados em qual tabela atualizar. Os novos dados são armazenados no parâmetro values. Os parâmetros selection e selectionArgs são usados ​​para restringir quais linhas atualizar e o número de linhas afetadas será retornado como o valor de retorno.

(5) deletar(). Remova os dados do ContentProvider. O parâmetro uri é usado para determinar os dados em qual tabela excluir, os parâmetros selection e selectionArgs são usados ​​para restringir quais linhas excluir e o número de linhas excluídas será retornado como o valor de retorno.

(6) getType(). Retorna o tipo MIME correspondente com base no URI de conteúdo de entrada. Pode-se ver que muitos métodos possuem o parâmetro uri, que também é passado ao chamar o método de adição, exclusão, modificação e consulta do contentresolver. Agora precisamos analisar o parâmetro uri de entrada e analisar a tabela e os dados que o chamador espera acessar.

Acho que você gosta

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