Condivisione della tecnologia

Nozioni di base sui database Android

2024-07-12

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

Sommario

1. Metodo di archiviazione dei dati Android

2. Transazioni del database

Caratteristiche delle transazioni del database (ACID)

livello di isolamento della transazione

riepilogo della transazione

3、ContetProvider

effetto

Modificare

URI dell'identificatore di risorsa uniforme

Modificare

Tipo MIME

Metodo principale ContentProvider

4、ContentResolver

effetto

metodo principale

Casi d'uso

Strumenti ausiliari

ContenutoUris

UriMatcher

Osservatore di contenuti


1. Metodo di archiviazione dei dati Android

  • Preferenza condivisa
  • Archiviazione di file
  • SQLite
  • Archiviazione di rete

2. Transazioni del database

Caratteristiche delle transazioni del database (ACID)

  • Atomicità: una transazione include tutte le operazioni che hanno esito positivo o che vengono riportate allo stato originale.
  • Coerenza: lo stato del database rimane coerente prima e dopo l'esecuzione della transazione
  • Isolamento: più utenti accedono al database contemporaneamente e più transazioni non si influenzano a vicenda.
  • Durabilità: una volta confermata una transazione, i dati nel database vengono modificati in modo permanente.

livello di isolamento della transazione

  • Leggi senza impegno
  • Lettura impegnata: evita letture sporche (lettura di dati non impegnati)
  • Ripetibilità: evita letture non ripetibili (per la transazione corrente, anche se i dati di origine vengono modificati da un'altra transazione, i dati visualizzati sono ancora nello stato all'inizio della transazione)
  • Serializzazione: evita letture fantasma (dopo che una transazione è stata avviata e ha letto i dati, un'altra transazione inserisce un nuovo record, in modo che la prima transazione possa vedere nuovi dati che non sono stati letti prima nelle operazioni successive).

riepilogo della transazione

3、ContetProvider

effetto

  • Il principio di base è utilizzare il meccanismo Binder
  • Fornisce un'interfaccia unificata per l'archiviazione e il recupero dei dati, consentendo la condivisione dei dati tra le applicazioni
  • I dati in diversi ContentProvider possono essere manipolati tramite URI
  • I processi esterni possono interagire con ContentProvider tramite la classe ContentResolver

  • Interazione e condivisione dei dati tra processi per ottenere una comunicazione tra processi
  • ContentProvider è equivalente a un porter La vera origine dati è il database, il file, l'XML e la rete.

URI dell'identificatore di risorsa uniforme

Identificare in modo univoco i dati in ContentProvider

Tipo MIME

Specificare un file con una determinata estensione da aprire con una determinata applicazione

Composizione del tipo MIME = tipo + sottotipo

Piace:

  • testo/html
  • testo/xml
  • testo/css
  • applicazione/pdf

Modulo di tipo MIME

Metodo principale 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、ContentResolver

effetto

I dati in diversi ContentProvider possono essere manipolati tramite URI

I processi esterni interagiscono con ContentProvider tramite ContentResolver

Gestione unificata di tutti i ContentProviders

metodo principale

ContentResolverla classe fornisceContentProvider4 metodi con lo stesso nome e funzione nella 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

Casi d'uso

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

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

Strumenti ausiliari

ContenutoUris

Aggiungi e ottieni ID all'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

Registra l'URI in ContentProvider, restituisce il codice di registrazione in base all'URI e abbina la tabella dati corrispondente in 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的表
    }   
}

Osservatore di contenuti

Osserva le modifiche ai dati in ContentProvider causate dall'URI e avvisa i visitatori

// 步骤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类进行解除