Technologieaustausch

Grundlagen der Android-Datenbank

2024-07-12

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

Inhaltsverzeichnis

1. Android-Datenspeichermethode

2. Datenbanktransaktionen

Merkmale von Datenbanktransaktionen (ACID)

Transaktionsisolationsstufe

Transaktions zusammenfassung

3. Inhaltsanbieter

Wirkung

Bearbeiten

Uniform Resource Identifier-URI

Bearbeiten

Mime Typ

ContentProvider-Hauptmethode

4. Inhaltsauflöser

Wirkung

Hauptmethode

Anwendungsfälle

Hilfswerkzeuge

Inhalts-Uris

UriMatcher

Inhaltsbeobachter


1. Android-Datenspeichermethode

  • Gemeinsame Präferenz
  • Dateispeicher
  • SQLite
  • Netzwerkspeicher

2. Datenbanktransaktionen

Merkmale von Datenbanktransaktionen (ACID)

  • Atomizität: Eine Transaktion umfasst alle Vorgänge, die entweder erfolgreich sind oder auf den ursprünglichen Zustand zurückgesetzt werden.
  • Konsistenz: Der Zustand der Datenbank bleibt vor und nach der Transaktionsausführung konsistent
  • Isolation: Mehrere Benutzer greifen gleichzeitig auf die Datenbank zu und mehrere Transaktionen wirken sich nicht gegenseitig aus.
  • Haltbarkeit: Sobald eine Transaktion festgeschrieben wird, werden die Daten in der Datenbank dauerhaft geändert.

Transaktionsisolationsstufe

  • Unverbindlich lesen
  • Festgeschriebenes Lesen: Dirty Reads vermeiden (nicht festgeschriebene Daten lesen)
  • Wiederholbarkeit: Vermeiden Sie nicht wiederholbare Lesevorgänge (für die aktuelle Transaktion sind die angezeigten Daten immer noch im Zustand zu Beginn der Transaktion, selbst wenn die Quelldaten durch eine andere Transaktion geändert werden).
  • Serialisierung: Vermeiden Sie Phantomlesevorgänge (nachdem eine Transaktion gestartet und die Daten gelesen hat, fügt eine andere Transaktion einen neuen Datensatz ein, sodass die erste Transaktion möglicherweise neue Daten sieht, die in nachfolgenden Vorgängen noch nicht gelesen wurden.)

Transaktions zusammenfassung

3. Inhaltsanbieter

Wirkung

  • Das zugrunde liegende Prinzip besteht darin, den Binder-Mechanismus zu verwenden
  • Bietet eine einheitliche Schnittstelle zum Speichern und Abrufen von Daten und ermöglicht den Datenaustausch zwischen Anwendungen
  • Daten in verschiedenen ContentProvidern können über URI manipuliert werden
  • Externe Prozesse können über die ContentResolver-Klasse mit ContentProvider interagieren

  • Interaktion und Austausch von Daten zwischen Prozessen, um eine prozessübergreifende Kommunikation zu erreichen
  • ContentProvider entspricht einem Porter. Die eigentliche Datenquelle ist Datenbank, Datei, XML und Netzwerk.

Uniform Resource Identifier-URI

Identifizieren Sie Daten im ContentProvider eindeutig

Mime Typ

Geben Sie eine Datei mit einer bestimmten Erweiterung an, die mit einer bestimmten Anwendung geöffnet werden soll

Zusammensetzung des MIME-Typs = Typ + Subtyp

wie:

  • text/html
  • text/xml
  • text/css
  • application/pdf

MIME-Typ-Formular

ContentProvider-Hauptmethode

//外部进程向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. Inhaltsauflöser

Wirkung

Daten in verschiedenen ContentProvidern können über URI manipuliert werden

Externe Prozesse interagieren mit ContentProvider über ContentResolver

Einheitliche Verwaltung aller ContentProvider

Hauptmethode

ContentResolverKlasse bietetContentProvider4 Methoden mit demselben Namen und derselben Funktion in der Klasse

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

Anwendungsfälle

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

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

Hilfswerkzeuge

Inhalts-Uris

ID an URI anhängen und abrufen

// 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

Registrieren Sie den URI im ContentProvider, geben Sie den Registrierungscode gemäß dem URI zurück und stimmen Sie ihn mit der entsprechenden Datentabelle im ContentProvider ab

// 步骤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的表
    }   
}

Inhaltsbeobachter

Beobachten Sie durch URI verursachte Datenänderungen im ContentProvider und benachrichtigen Sie Besucher

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