Обмен технологиями

Основы базы данных Android

2024-07-12

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

Оглавление

1. Метод хранения данных Android

2. Транзакции базы данных

Характеристики транзакций базы данных (ACID)

уровень изоляции транзакции

сводка транзакции

3.ContetProvider

эффект

Редактировать

URI универсального идентификатора ресурса

Редактировать

MIME-тип

Основной метод ContentProvider

4. ContentResolver

эффект

основной метод

Случаи использования

Вспомогательные инструменты

ContentUris

UriMatcher

ContentObserver


1. Метод хранения данных Android

  • SharedPreference
  • Файловое хранилище
  • SQLite
  • Сетевое хранилище

2. Транзакции базы данных

Характеристики транзакций базы данных (ACID)

  • Атомарность: транзакция включает в себя все операции, которые либо завершаются успешно, либо откатываются в исходное состояние.
  • Согласованность: состояние базы данных остается согласованным до и после выполнения транзакции.
  • Изоляция: несколько пользователей одновременно обращаются к базе данных, и несколько транзакций не влияют друг на друга.
  • Долговечность: после фиксации транзакции данные в базе данных постоянно изменяются.

уровень изоляции транзакции

  • Читать незафиксированные
  • Чтение зафиксировано: избегайте грязного чтения (чтение незафиксированных данных)
  • Повторяемость: избегайте неповторяющихся операций чтения (для текущей транзакции, даже если исходные данные изменены другой транзакцией, данные, которые она видит, по-прежнему остаются в состоянии в начале транзакции).
  • Сериализация: избегайте фантомного чтения (после того, как одна транзакция началась и прочитала данные, другая транзакция вставляет новую запись, так что первая транзакция может видеть новые данные, которые не были прочитаны ранее в последующих операциях.)

сводка транзакции

3.ContetProvider

эффект

  • Основной принцип заключается в использовании механизма Binder.
  • Предоставляет унифицированный интерфейс для хранения и извлечения данных, позволяющий обмениваться данными между приложениями.
  • Данными в разных ContentProviders можно манипулировать через URI.
  • Внешние процессы могут взаимодействовать с ContentProvider через класс ContentResolver.

  • Межпроцессное взаимодействие и обмен данными для обеспечения межпроцессного взаимодействия.
  • 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. ContentResolver

эффект

Данными в разных ContentProviders можно манипулировать через URI.

Внешние процессы взаимодействуют с ContentProvider через ContentResolver

Единое управление всеми ContentProviders

основной метод

ContentResolverкласс обеспечиваетContentProvider4 метода с одинаковым именем и функцией в классе

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

Вспомогательные инструменты

ContentUris

Добавить и получить идентификатор в 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

Зарегистрируйте URI в ContentProvider, верните код регистрации в соответствии с 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的表
    }   
}

ContentObserver

Наблюдайте за изменениями данных в ContentProvider, вызванными URI, и уведомляйте посетителей.

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