Berbagi teknologi

Dasar-dasar basis data Android

2024-07-12

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

Daftar isi

1. Metode penyimpanan data Android

2. Basis data transaksi

Karakteristik transaksi database (ACID)

tingkat isolasi transaksi

ringkasan transaksi

3、Penyedia Konten

memengaruhi

Sunting

URI Pengidentifikasi Sumber Daya Seragam

Sunting

tipe MIME

Metode utama Penyedia Konten

4.Penyelesai Konten

memengaruhi

metode utama

Kasus Penggunaan

Alat bantu

KontenUris

Pencocokan Uri

Pengamat Konten


1. Metode penyimpanan data Android

  • Preferensi Bersama
  • Penyimpanan berkas
  • Bahasa SQLite
  • Penyimpanan Jaringan

2. Basis data transaksi

Karakteristik transaksi database (ACID)

  • Atomicity: Suatu transaksi mencakup semua operasi yang berhasil atau dikembalikan ke keadaan semula.
  • Konsistensi: Keadaan database tetap konsisten sebelum dan sesudah eksekusi transaksi
  • Isolasi: Banyak pengguna mengakses database secara bersamaan, dan banyak transaksi tidak saling mempengaruhi.
  • Daya Tahan: Setelah transaksi dilakukan, data dalam database diubah secara permanen.

tingkat isolasi transaksi

  • Baca tanpa komitmen
  • Baca yang dikomit: hindari pembacaan yang kotor (baca data yang tidak dikomit)
  • Pengulangan: Hindari pembacaan yang tidak dapat diulang (untuk transaksi saat ini, meskipun data sumber diubah oleh transaksi lain, data yang dilihatnya tetap dalam keadaan di awal transaksi)
  • Serialisasi: Hindari pembacaan bayangan (setelah satu transaksi dimulai dan membaca data, transaksi lain menyisipkan catatan baru, sehingga transaksi pertama dapat melihat data baru yang belum pernah dibaca sebelumnya pada operasi berikutnya.)

ringkasan transaksi

3、Penyedia Konten

memengaruhi

  • Prinsip dasarnya adalah menggunakan mekanisme Binder
  • Menyediakan antarmuka terpadu untuk menyimpan dan mengambil data, memungkinkan berbagi data antar aplikasi
  • Data di Penyedia Konten yang berbeda dapat dimanipulasi melalui URI
  • Proses eksternal dapat berinteraksi dengan ContentProvider melalui kelas ContentResolver

  • Interaksi dan berbagi data antar-proses untuk mencapai komunikasi lintas-proses
  • ContentProvider setara dengan porter. Sumber data sebenarnya adalah database, file, XML, dan jaringan.

URI Pengidentifikasi Sumber Daya Seragam

Identifikasi data secara unik di ContentProvider

tipe MIME

Tentukan file dengan ekstensi tertentu untuk dibuka dengan aplikasi tertentu

Komposisi tipe MIME = tipe + subtipe

menyukai:

  • teks/html
  • teks/xml
  • teks/css
  • aplikasi/pdf

Formulir tipe MIME

Metode utama Penyedia Konten

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

memengaruhi

Data di Penyedia Konten yang berbeda dapat dimanipulasi melalui URI

Proses eksternal berinteraksi dengan ContentProvider melalui ContentResolver

Manajemen terpadu untuk semua Penyedia Konten

metode utama

ContentResolverkelas menyediakanContentProvider4 metode dengan nama & fungsi yang sama di kelas

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

Kasus Penggunaan

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

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

Alat bantu

KontenUris

Tambahkan & Dapatkan ID ke 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

Pencocokan Uri

Daftarkan URI di ContentProvider, kembalikan kode registrasi sesuai URI, dan cocokkan tabel data terkait di 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的表
    }   
}

Pengamat Konten

Amati perubahan data di ContentProvider yang disebabkan oleh URI & beri tahu pengunjung

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