Compartir tecnología

Conceptos básicos de la base de datos de Android

2024-07-12

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

Tabla de contenido

1. Método de almacenamiento de datos de Android

2. Transacciones de bases de datos

Características de las transacciones de bases de datos (ACID)

nivel de aislamiento de transacciones

Resumen de Transacciones

3. Proveedor de contenido

efecto

Editar

URI de identificador uniforme de recursos

Editar

Tipo de Mimica

Método principal de ContentProvider

4. Resolución de contenido

efecto

método principal

Casos de uso

herramientas auxiliares

ContenidoUris

UriMatcher

Observador de contenido


1. Método de almacenamiento de datos de Android

  • Preferencia compartida
  • Almacenamiento de archivos
  • SQLite
  • Almacenamiento en red

2. Transacciones de bases de datos

Características de las transacciones de bases de datos (ACID)

  • Atomicidad: una transacción incluye todas las operaciones que tienen éxito o se revierten al estado original.
  • Consistencia: el estado de la base de datos permanece consistente antes y después de la ejecución de la transacción.
  • Aislamiento: varios usuarios acceden a la base de datos al mismo tiempo y varias transacciones no se afectan entre sí.
  • Durabilidad: una vez que se confirma una transacción, los datos de la base de datos se modifican permanentemente.

nivel de aislamiento de transacciones

  • Leer no comprometido
  • Lectura comprometida: evite lecturas sucias (lea datos no confirmados)
  • Repetibilidad: evite lecturas no repetibles (para la transacción actual, incluso si otra transacción modifica los datos de origen, los datos que ve siguen siendo el estado al comienzo de la transacción)
  • Serialización: evite lecturas fantasmas (después de que una transacción ha comenzado y leído los datos, otra transacción inserta un nuevo registro, de modo que la primera transacción pueda ver nuevos datos que no se han leído antes en operaciones posteriores).

Resumen de Transacciones

3. Proveedor de contenido

efecto

  • El principio subyacente es utilizar el mecanismo Binder.
  • Proporciona una interfaz unificada para almacenar y recuperar datos, lo que permite compartir datos entre aplicaciones.
  • Los datos en diferentes ContentProviders se pueden manipular a través de URI
  • Los procesos externos pueden interactuar con ContentProvider a través de la clase ContentResolver

  • Interacción e intercambio de datos entre procesos para lograr la comunicación entre procesos.
  • ContentProvider es equivalente a un portero. La fuente de datos real es la base de datos, el archivo, el XML y la red.

URI de identificador uniforme de recursos

Identificar datos de forma única en ContentProvider

Tipo de Mimica

Especifique un archivo con una determinada extensión para abrir con una determinada aplicación

Composición de tipo MIME = tipo + subtipo

como:

  • texto/html
  • texto/xml
  • texto/css
  • Solicitud PDF

formulario tipo MIME

Método principal de 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. Resolución de contenido

efecto

Los datos en diferentes ContentProviders se pueden manipular a través de URI

Los procesos externos interactúan con ContentProvider a través de ContentResolver

Gestión unificada de todos los ContentProviders

método principal

ContentResolverla clase proporcionaContentProvider4 métodos con el mismo nombre y función en la clase

//外部进程向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")

herramientas auxiliares

ContenidoUris

Agregar y obtener ID a 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 el URI en ContentProvider, devuelva el código de registro de acuerdo con el URI y haga coincidir la tabla de datos correspondiente en 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 contenido

Observe los cambios de datos en ContentProvider causados ​​por URI y notifique a los 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类进行解除