Compartilhamento de tecnologia

Noções básicas de banco de dados Android

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Índice

1. Método de armazenamento de dados Android

2. Transações de banco de dados

Características das transações de banco de dados (ACID)

nível de isolamento de transação

Resumo transação

3、Provedor de conteúdo

efeito

Editar

URI do identificador uniforme de recursos

Editar

Tipo MIME

Método principal ContentProvider

4、Resolução de conteúdo

efeito

método principal

Casos de uso

Ferramentas auxiliares

ConteúdoUris

UriMatcher

Observador de conteúdo


1. Método de armazenamento de dados Android

  • Preferência Compartilhada
  • Armazenamento de arquivo
  • SQLite
  • Armazenamento de rede

2. Transações de banco de dados

Características das transações de banco de dados (ACID)

  • Atomicidade: uma transação inclui todas as operações bem-sucedidas ou revertidas ao estado original.
  • Consistência: O estado do banco de dados permanece consistente antes e depois da execução da transação
  • Isolamento: Vários usuários acessam o banco de dados simultaneamente e várias transações não afetam umas às outras.
  • Durabilidade: Depois que uma transação é confirmada, os dados do banco de dados são modificados permanentemente.

nível de isolamento de transação

  • Leia sem compromisso
  • Leitura confirmada: evite leituras sujas (leia dados não confirmados)
  • Repetibilidade: Evite leituras não repetíveis (para a transação atual, mesmo que os dados de origem sejam modificados por outra transação, os dados que ele vê ainda são o estado no início da transação)
  • Serialização: evite leituras fantasmas (após uma transação ter iniciado e lido os dados, outra transação insere um novo registro, para que a primeira transação possa ver novos dados que não foram lidos antes nas operações subsequentes).

Resumo transação

3、Provedor de conteúdo

efeito

  • O princípio subjacente é usar o mecanismo Binder
  • Fornece uma interface unificada para armazenar e recuperar dados, permitindo o compartilhamento de dados entre aplicativos
  • Dados em diferentes ContentProviders podem ser manipulados através de URI
  • Processos externos podem interagir com ContentProvider por meio da classe ContentResolver

  • Interação e compartilhamento de dados entre processos para alcançar comunicação entre processos
  • ContentProvider é equivalente a um porteiro. A fonte de dados real é banco de dados, arquivo, XML e rede.

URI do identificador uniforme de recursos

Identifique dados exclusivamente no ContentProvider

Tipo MIME

Especifique um arquivo com uma determinada extensão para abrir com um determinado aplicativo

Composição do tipo MIME = tipo + subtipo

como:

  • texto/html
  • texto/xml
  • texto/css
  • aplicação/pdf

Formulário de tipo MIME

Método principal ContentProvider

//外部进程向ContentProvider中添加数据
fun insert(uri:Uri,contentValues values):Uri
//外部进程删除ContentProvider中数据
fun delete(uri:Uri,selection:String,selectionArgs:String[]):Int
//外部进程更新ContentProvider中数据
fun update(uri:Uri,values:ContentValues,selection:String,selectionArgs:String[]):int
//外部应用获取ContentProvider中数据
fun query (uri:Uri,projection:String[],selection:String,selectionArgs:String[],sortOrder:String):Cursor

4、Resolução de conteúdo

efeito

Dados em diferentes ContentProviders podem ser manipulados através de URI

Processos externos interagem com ContentProvider por meio de ContentResolver

Gerenciamento unificado de todos os ContentProviders

método principal

ContentResolverclasse forneceContentProvider4 métodos com o mesmo nome e função na classe

//外部进程向ContentProvider中添加数据
fun insert(uri:Uri,contentValues values):Uri
//外部进程删除ContentProvider中数据
fun delete(uri:Uri,selection:String,selectionArgs:String[]):Int
//外部进程更新ContentProvider中数据
fun update(uri:Uri,values:ContentValues,selection:String,selectionArgs:String[]):int
//外部应用获取ContentProvider中数据
fun query (uri:Uri,projection:String[],selection:String,selectionArgs:String[],sortOrder:String):Cursor

Casos de uso

val resolver = getContentResolver()
val uri = Uri.parse("content://cn.scu.myprovider/user")

val cursor:Cursor = resolver.query(uri,null,null,null,"userid desc")

Ferramentas auxiliares

ConteúdoUris

Anexar e obter ID ao URI

// withAppendedId()作用:向URI追加一个id
Uri uri = Uri.parse("content://cn.scu.myprovider/user") 
Uri resultUri = ContentUris.withAppendedId(uri, 7);  
// 最终生成后的Uri为:content://cn.scu.myprovider/user/7

// parseId()作用:从URL中获取ID
Uri uri = Uri.parse("content://cn.scu.myprovider/user/7") 
long personid = ContentUris.parseId(uri); 
//获取的结果为:7

UriMatcher

Registre o URI no ContentProvider, retorne o código de registro de acordo com o URI e corresponda à tabela de dados correspondente no ContentProvider

// 步骤1:初始化UriMatcher对象
    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 
    //常量UriMatcher.NO_MATCH  = 不匹配任何路径的返回码
    // 即初始化时不匹配任何东西

// 步骤2:在ContentProvider 中注册URI(addURI())
    int URI_CODE_a = 1;
    int URI_CODE_b = 2;
    matcher.addURI("cn.scu.myprovider", "user1", URI_CODE_a); 
    matcher.addURI("cn.scu.myprovider", "user2", URI_CODE_b); 
    // 若URI资源路径 = content://cn.scu.myprovider/user1 ,则返回注册码URI_CODE_a
    // 若URI资源路径 = content://cn.scu.myprovider/user2 ,则返回注册码URI_CODE_b

// 步骤3:根据URI 匹配 URI_CODE,从而匹配ContentProvider中相应的资源(match())

@Override   
    public String getType(Uri uri) {   
      Uri uri = Uri.parse(" content://cn.scu.myprovider/user1");   

      switch(matcher.match(uri)){   
     // 根据URI匹配的返回码是URI_CODE_a
     // 即matcher.match(uri) == URI_CODE_a
      case URI_CODE_a:   
        return tableNameUser1;   
        // 如果根据URI匹配的返回码是URI_CODE_a,则返回ContentProvider中的名为tableNameUser1的表
      case URI_CODE_b:   
        return tableNameUser2;
        // 如果根据URI匹配的返回码是URI_CODE_b,则返回ContentProvider中的名为tableNameUser2的表
    }   
}

Observador de conteúdo

Observe alterações de dados no ContentProvider causadas por URI e notifique os visitantes

// 步骤1:注册内容观察者ContentObserver
    getContentResolver().registerContentObserver(uri);
    // 通过ContentResolver类进行注册,并指定需要观察的URI

// 步骤2:当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者)
    public class UserContentProvider extends ContentProvider { 
      public Uri insert(Uri uri, ContentValues values) { 
      db.insert("user", "userid", values); 
      getContext().getContentResolver().notifyChange(uri, null); 
      // 通知访问者
   } 
}

// 步骤3:解除观察者
 getContentResolver().unregisterContentObserver(uri);
    // 同样需要通过ContentResolver类进行解除