Teknologian jakaminen

Android-tietokannan perusteet

2024-07-12

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

Sisällysluettelo

1. Android-tietojen tallennusmenetelmä

2. Tietokantatapahtumat

Tietokantatapahtumien ominaisuudet (ACID)

liiketoimien eristystaso

Liiketoimien yhteenveto

3、ContetProvider

vaikutus

Muokata

Uniform Resource Identifier URI

Muokata

MIME-tyyppi

ContentProviderin päämenetelmä

4、ContentResolver

vaikutus

päämenetelmä

Käytä koteloita

Aputyökalut

ContentUris

UriMatcher

ContentObserver


1. Android-tietojen tallennusmenetelmä

  • SharedPreference
  • Tiedostojen tallennus
  • SQLite
  • Verkkotallennus

2. Tietokantatapahtumat

Tietokantatapahtumien ominaisuudet (ACID)

  • Atomuus: Tapahtuma sisältää kaikki toiminnot, jotka joko onnistuvat tai palautetaan alkuperäiseen tilaan.
  • Johdonmukaisuus: Tietokannan tila pysyy yhtenäisenä ennen tapahtuman suorittamista ja sen jälkeen
  • Eristäminen: Useat käyttäjät käyttävät tietokantaa samanaikaisesti, eivätkä useat tapahtumat vaikuta toisiinsa.
  • Kestävyys: Kun tapahtuma on sitoutunut, tietokannan tiedot muuttuvat pysyvästi.

liiketoimien eristystaso

  • Lue sitoutumaton
  • Sitoutunut lukeminen: vältä likaisia ​​lukuja (lue sitomattomia tietoja)
  • Toistettavuus: Vältä ei-toistettavia lukuja (nykyisessä tapahtumassa, vaikka lähdetietoja muuttaisi toinen tapahtuma, sen näkemä data on edelleen tapahtuman alun tila)
  • Serialisointi: Vältä haamulukuja (kun yksi tapahtuma on alkanut ja lukenut tiedot, toinen tapahtuma lisää uuden tietueen, jotta ensimmäinen tapahtuma voi nähdä uusia tietoja, joita ei ole ennen luettu myöhemmissä toiminnoissa.)

Liiketoimien yhteenveto

3、ContetProvider

vaikutus

  • Perusperiaatteena on käyttää Binder-mekanismia
  • Tarjoaa yhtenäisen käyttöliittymän tietojen tallentamiseen ja hakemiseen, mikä mahdollistaa tietojen jakamisen sovellusten välillä
  • Eri sisällöntarjoajien tietoja voidaan käsitellä URI:n kautta
  • Ulkoiset prosessit voivat olla vuorovaikutuksessa ContentProviderin kanssa ContentResolver-luokan kautta

  • Prosessien välinen tietojen vuorovaikutus ja jakaminen prosessien välisen viestinnän saavuttamiseksi
  • ContentProvider vastaa portteria. Todellinen tietolähde on tietokanta, tiedosto, XML ja verkko.

Uniform Resource Identifier URI

Yksilöitävät tiedot ContentProviderissa

MIME-tyyppi

Määritä tiedosto, jolla on tietty tunniste, joka avataan tietyllä sovelluksella

MIME-tyypin koostumus = tyyppi + alatyyppi

Kuten:

  • teksti/html
  • teksti/xml
  • teksti/css
  • sovellus/pdf

MIME-tyyppinen lomake

ContentProviderin päämenetelmä

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

vaikutus

Eri sisällöntarjoajien tietoja voidaan käsitellä URI:n kautta

Ulkoiset prosessit ovat vuorovaikutuksessa ContentProviderin kanssa ContentResolverin kautta

Kaikkien sisällöntarjoajien yhtenäinen hallinta

päämenetelmä

ContentResolverluokka tarjoaaContentProvider4 menetelmää, joilla on sama nimi ja funktio luokassa

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

Käytä koteloita

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

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

Aputyökalut

ContentUris

Liitä ja hanki tunnus URI:hen

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

Rekisteröi URI ContentProviderissa, palauta rekisteröintikoodi URI:n mukaan ja täsmää vastaava tietotaulukko ContentProviderissa

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

ContentObserver

Tarkkaile URI:n aiheuttamia tietomuutoksia ContentProviderissa ja ilmoita vierailijoille

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