>  기사  >  Java  >  Android ContentProvider 구현 및 간단한 예제 코드

Android ContentProvider 구현 및 간단한 예제 코드

高洛峰
高洛峰원래의
2017-02-07 15:47:591468검색

1. 개념 및 설명

ContentProvider 정의:

Content Provider는 Android 애플리케이션의 기본 모듈로, 애플리케이션에 콘텐츠를 제공합니다. 이 ContentResolver 인터페이스를 통해 애플리케이션에 제공하고 ContentProvider를 사용하여 서로 다른 애플리케이션 간에 데이터를 공유합니다. Android는 일부 공통 데이터에 대해 ContentProvider(비디오, 오디오)를 제공하여 테이블 형식을 사용하여 데이터를 구성합니다.

URI 정의:

각 ContentProvider에는 이 ContentProvider가 제공하는 데이터를 나타내는 데 사용되는 공개 URI가 있습니다. Android에서 제공하는 ContentProvider는 android.provider에 저장됩니다.

2. ContentProvider 구현 과정

1. ContentProvider에 필요한 상수를 정의합니다(가장 중요한 것은 CONTENT_URI를 정의하는 것이며, CONTENT_URI는 Uri 유형이며 사실은 문자열 구문 분석을 통해 얻습니다)

//定义ContentProvider所需要的常量 
public class FirstProviderMetaData { 
  
  // AUTHORIY等于自己的创建ContentProvider类的完全路径 
  public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider"; 
  
  // 数据库的名称 
  public static final String DATABASE_NAME = "FirstProvider.db"; 
  
  // BaseColumns有两个字段_id和_count 
  public static final class UserTableMetaData implements BaseColumns { 
    // 表名 
    public static final String TABLE_NAME = "t_user"; 
    // 访问该ContentProvider的URI 
    public static final Uri CONTENT_URI = Uri 
        .parse("content://" + AUTHORIY); 
  
    // 表的数据类型 
    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users"; 
    // 一列的数据类型 
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/users"; 
  
    // 一个字段 
    public static final String USER_NAME = "name"; 
  
    // 默认排序 
    public static final String DEFAULT_SORT_ORDER = "_id desc"; 
  } 
}

2. ContentProvider를 상속하는 클래스 정의

3. 쿼리, 삽입, 업데이트, 삭제, getType 및 onCreate 메소드

(1)를 구현합니다. UriMatcher

// 匹配Uri,检查Uri的合法性
  public static final UriMatcher uriMatcher;
  public static final int INCOMING_USER_COLLECTION = 1;
  public static final int INCOMING_USER_SIGNLE = 2;
  static {
    // 创建一个uri树的根结点
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    // 添加uri匹配对,如果这个匹配成功,则code值则会返回。
    uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user",
        INCOMING_USER_COLLECTION);
    uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user/#",
        INCOMING_USER_SIGNLE);
  
  }

(2)를 정의합니다.

// 根据传入uri,所回该uri所表示的数据类型
  @Override
  public String getType(Uri uri) {
    // TODO Auto-generated method stub
    switch (uriMatcher.match(uri)) {
    case INCOMING_USER_COLLECTION:
      return UserTableMetaData.CONTENT_TYPE;
    case INCOMING_USER_SIGNLE:
      return UserTableMetaData.CONTENT_ITEM_TYPE;
    default:
      throw new IllegalArgumentException("Unknown URI" + uri);
    }
  
  }

(3) userProjectMap 해시 맵 정적 객체 생성

public static HashMap<String, String> userProjectMap;
  static {
    userProjectMap = new HashMap<String, String>();
    userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
    userProjectMap.put(UserTableMetaData.USER_NAME,
        UserTableMetaData.USER_NAME);
  }

( 4) 삽입 방법

// 该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据
  @Override
  public Uri insert(Uri uri, ContentValues values) {
    // TODO Auto-generated method stub
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    // rowId是新插入数据的id
    long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
    // 正常插入,-1为出常错误
    if (rowId != -1) {
      // 添加一个id到这个路径的结尾
      Uri insertUserUri = ContentUris.withAppendedId(
          UserTableMetaData.CONTENT_URI, rowId);
      // 得到一个ContentResolver实例.
      ContentResolver cr = this.getContext().getContentResolver();
      // 通辞呈数据改变
      cr.notifyChange(insertUserUri, null);
  
      return insertUserUri;
    } else {
      throw new SQLException("Failed to insert row into" + uri);
    }
  }

(5) 쿼리 방법

@Override
  public Cursor query(Uri uri, String[] projection, String selection,
      String[] selectionArgs, String sortOrder) {
    // TODO Auto-generated method stub
    SQLiteQueryBuilder sqb = new SQLiteQueryBuilder();
    switch (uriMatcher.match(uri)) {
    case INCOMING_USER_COLLECTION:
      sqb.setTables(UserTableMetaData.TABLE_NAME);
      sqb.setProjectionMap(userProjectMap);
      break;
    case INCOMING_USER_SIGNLE:
      sqb.setTables(UserTableMetaData.TABLE_NAME);
      sqb.setProjectionMap(userProjectMap);
  
      String idKey = UserTableMetaData._ID;
      // 1得到path集合
      // 2取它的集合的第2个元素
      // 例如:CONTENT_URI等于content://com.example.firstconent.FirstContentProvider/t_user/id,
      // content://为协议
      // com.example.firstconent.FirstContentProvider为authoriy
      // /t_user/id为path
      String idValue = uri.getPathSegments().get(1);
  
      sqb.appendWhere(idKey + "=" + idValue);
      break;
    }
    String orderBy = null;
    if (TextUtils.isEmpty(sortOrder)) {
      orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
    } else {
      orderBy = sortOrder;
    }
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    Cursor cursor = sqb.query(db, projection, selection, selectionArgs,
        null, null, orderBy);
    ContentResolver cr = this.getContext().getContentResolver();
    // 通适数据变动
    cursor.setNotificationUri(cr, uri);
    return cursor;
  }

4. AndroidManifest.xml에

<provider
      android:name="com.example.firstcontent.FirstContentProvider"
      android:authorities="com.example.first.firstcontent.FirstContentProvider" >
    </provider>

를 선언하세요. 읽어주셔서 감사합니다. 이 사이트를 지원해 주셔서 감사합니다.

Android ContentProvider 구현과 간단한 예제 코드에 관한 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.