기술나눔

Android 데이터베이스 기본 사항

2024-07-12

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

목차

1. 안드로이드 데이터 저장 방식

2. 데이터베이스 트랜잭션

데이터베이스 트랜잭션의 특성(ACID)

트랜잭션 격리 수준

거래 요약

3、컨텐츠 제공자

효과

편집하다

통일 자원 식별자 URI

편집하다

MIME 유형

ContentProvider 기본 메서드

4、컨텐트 리졸버

효과

주요 방법

사용 사례

보조 도구

콘텐츠Uris

유리매처

콘텐츠 관찰자


1. 안드로이드 데이터 저장 방식

  • 공유 선호도
  • 파일 저장
  • SQLite
  • 네트워크 스토리지

2. 데이터베이스 트랜잭션

데이터베이스 트랜잭션의 특성(ACID)

  • 원자성: 트랜잭션에는 성공하거나 원래 상태로 롤백되는 모든 작업이 포함됩니다.
  • 일관성: 트랜잭션 실행 전후에 데이터베이스 상태가 일관되게 유지됩니다.
  • 격리: 여러 사용자가 동시에 데이터베이스에 액세스하며 여러 트랜잭션이 서로 영향을 미치지 않습니다.
  • 내구성: 트랜잭션이 커밋되면 데이터베이스의 데이터가 영구적으로 수정됩니다.

트랜잭션 격리 수준

  • 커밋되지 않은 읽기
  • 커밋된 읽기: 더티 읽기 방지(커밋되지 않은 데이터 읽기)
  • 반복성: 반복 불가능한 읽기 방지(현재 트랜잭션의 경우 소스 데이터가 다른 트랜잭션에 의해 수정되더라도 표시되는 데이터는 여전히 트랜잭션 시작 시점의 상태입니다)
  • 직렬화: 팬텀 읽기 방지(한 트랜잭션이 시작되어 데이터를 읽은 후 다른 트랜잭션이 새 레코드를 삽입하므로 첫 번째 트랜잭션은 후속 작업에서 이전에 읽지 않은 새 데이터를 볼 수 있습니다.)

거래 요약

3、컨텐츠 제공자

효과

  • 기본 원칙은 바인더 메커니즘을 사용하는 것입니다.
  • 데이터 저장 및 검색을 위한 통합 인터페이스를 제공하여 애플리케이션 간 데이터 공유가 가능합니다.
  • 다양한 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와 상호 작용합니다.

모든 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")

보조 도구

콘텐츠Uris

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