技術共有

Android データベースの基本

2024-07-12

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

目次

1.Androidのデータ保存方法

2. データベーストランザクション

データベーストランザクションの特徴(ACID)

トランザクション分離レベル

取引概要

3、コンテンツプロバイダー

効果

編集

統一リソース識別子 URI

編集

MIMEタイプ

ContentProvider のメイン メソッド

4、コンテンツリゾルバ

効果

メインメソッド

使用例

補助ツール

コンテンツURI

ウリマッチャー

コンテンツオブザーバー


1.Androidのデータ保存方法

  • 共有設定
  • ファイルストレージ
  • SQLite
  • ネットワークストレージ

2. データベーストランザクション

データベーストランザクションの特徴(ACID)

  • アトミック性: トランザクションには、成功するか、元の状態にロールバックされるすべての操作が含まれます。
  • 一貫性: トランザクション実行の前後でデータベースの状態が一貫した状態を維持します。
  • 分離: 複数のユーザーがデータベースに同時にアクセスし、複数のトランザクションが相互に影響を与えることはありません。
  • 耐久性: トランザクションがコミットされると、データベース内のデータは永続的に変更されます。

トランザクション分離レベル

  • コミットされていない読み取り
  • コミットされた読み取り: ダーティ読み取り (コミットされていないデータの読み取り) を回避します。
  • 反復性: 反復不可能な読み取りを回避します (現在のトランザクションでは、ソース データが別のトランザクションによって変更された場合でも、表示されるデータはトランザクションの開始時の状態のままです)。
  • シリアル化: ファントム読み取りを回避します (1 つのトランザクションが開始されてデータが読み取られた後、別のトランザクションが新しいレコードを挿入します。そのため、最初のトランザクションは、後続の操作でこれまでに読み取られていない新しいデータを参照する可能性があります)。

取引概要

3、コンテンツプロバイダー

効果

  • 基礎となる原則は、Binder メカニズムを使用することです。
  • データの保存と取得のための統合インターフェイスを提供し、アプリケーション間でのデータ共有を可能にします。
  • 異なる ContentProvider のデータは URI を通じて操作可能
  • 外部プロセスは、ContentResolver クラスを通じて ContentProvider と対話できます。

  • クロスプロセス通信を実現するためのプロセス間データの対話と共有
  • ContentProvider はポーターに相当します。実際のデータ ソースはデータベース、ファイル、XML、ネットワークです。

統一リソース識別子 URI

ContentProvider 内のデータを一意に識別する

MIMEタイプ

特定の拡張子のファイルを指定して特定のアプリケーションで開く

MIME タイプの構成 = タイプ + サブタイプ

のように:

  • テキスト/HTML
  • テキスト/xml
  • テキスト/css
  • アプリケーション/pdf

MIME タイプ形式

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、コンテンツリゾルバ

効果

異なる ContentProvider のデータは URI を通じて操作可能

外部プロセスは、ContentResolver を通じて ContentProvider と対話します。

すべてのコンテンツプロバイダーの統合管理

メインメソッド

ContentResolverクラスが提供するContentProviderクラス内に同じ名前と機能を持つ 4 つのメソッド

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

使用例

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

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

補助ツール

コンテンツURI

URIにIDを追加して取得

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

ウリマッチャー

ContentProvider に URI を登録し、URI に従って登録コードを返し、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的表
    }   
}

コンテンツオブザーバー

URI に起因する ContentProvider 内のデータ変更を監視し、訪問者に通知します

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