Partage de technologie

Bases de base de données Android

2024-07-12

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

Table des matières

1. Méthode de stockage de données Android

2. Transactions de base de données

Caractéristiques des transactions de base de données (ACID)

niveau d'isolement des transactions

récapitulatif des transactions

3. Fournisseur de contenu

effet

Modifier

URI de l'identifiant de ressource uniforme

Modifier

Type MIME

Méthode principale de ContentProvider

4. Résolveur de contenu

effet

méthode principale

Cas d'utilisation

Outils auxiliaires

ContenuUris

UriMatcher

Observateur de contenu


1. Méthode de stockage de données Android

  • Préférence partagée
  • Stockage de fichiers
  • SQLite
  • Stockage réseau

2. Transactions de base de données

Caractéristiques des transactions de base de données (ACID)

  • Atomicité : une transaction inclut toutes les opérations qui réussissent ou qui sont rétablies à leur état d'origine.
  • Cohérence : l'état de la base de données reste cohérent avant et après l'exécution de la transaction
  • Isolation : plusieurs utilisateurs accèdent simultanément à la base de données et plusieurs transactions ne s'affectent pas.
  • Durabilité : Une fois qu'une transaction est validée, les données de la base de données sont définitivement modifiées.

niveau d'isolement des transactions

  • Lire non validé
  • Lecture validée : évitez les lectures sales (lire les données non validées)
  • Répétabilité : évitez les lectures non répétables (pour la transaction en cours, même si les données source sont modifiées par une autre transaction, les données qu'elle voit sont toujours l'état au début de la transaction)
  • Sérialisation : évitez les lectures fantômes (après qu'une transaction a démarré et lu les données, une autre transaction insère un nouvel enregistrement, de sorte que la première transaction puisse voir de nouvelles données qui n'ont pas été lues auparavant lors des opérations ultérieures.)

récapitulatif des transactions

3. Fournisseur de contenu

effet

  • Le principe sous-jacent est d'utiliser le mécanisme Binder
  • Fournit une interface unifiée pour stocker et récupérer des données, permettant le partage de données entre les applications
  • Les données de différents ContentProviders peuvent être manipulées via l'URI
  • Les processus externes peuvent interagir avec ContentProvider via la classe ContentResolver

  • Interaction et partage de données inter-processus pour parvenir à une communication inter-processus
  • ContentProvider est équivalent à un porteur. La véritable source de données est la base de données, le fichier, le XML et le réseau.

URI de l'identifiant de ressource uniforme

Identifier de manière unique les données dans ContentProvider

Type MIME

Spécifiez un fichier avec une certaine extension à ouvrir avec une certaine application

Composition du type MIME = type + sous-type

comme:

  • texte/html
  • texte/xml
  • texte/css
  • candidature/pdf

Formulaire de type MIME

Méthode principale 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. Résolveur de contenu

effet

Les données de différents ContentProviders peuvent être manipulées via l'URI

Les processus externes interagissent avec ContentProvider via ContentResolver

Gestion unifiée de tous les ContentProviders

méthode principale

ContentResolverla classe fournitContentProvider4 méthodes avec le même nom et fonction dans la 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

Cas d'utilisation

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

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

Outils auxiliaires

ContenuUris

Ajouter et obtenir l'ID à l'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

Enregistrez l'URI dans ContentProvider, renvoyez le code d'enregistrement en fonction de l'URI et faites correspondre la table de données correspondante dans 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的表
    }   
}

Observateur de contenu

Observez les changements de données dans ContentProvider provoqués par l'URI et informez les visiteurs

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