Heim  >  Artikel  >  Java  >  Implementierung von Android ContentProvider und einfacher Beispielcode

Implementierung von Android ContentProvider und einfacher Beispielcode

高洛峰
高洛峰Original
2017-02-07 15:47:591472Durchsuche

1. Konzept und Beschreibung

ContentProvider-Definition:

Content Provider ist das Basismodul einer Android-Anwendung, das Inhalte für die Anwendung bereitstellt Stellen Sie es der Anwendung über diese ContentResolver-Schnittstelle zur Verfügung und verwenden Sie ContentProvider, um Daten zwischen verschiedenen Anwendungen auszutauschen. Android stellt ContentProvider (Video, Audio) für einige allgemeine Daten bereit. ContentProvider verwendet die Form einer Tabelle, um Daten zu organisieren.

URI-Definition:

Jeder ContentProvider verfügt über einen öffentlichen URI, der zur Darstellung der von diesem ContentProvider bereitgestellten Daten verwendet wird. Von Android bereitgestellte ContentProvider werden in android.provider gespeichert.

2. Der Prozess der Implementierung von ContentProvider

1. Definieren Sie die für ContentProvider erforderlichen Konstanten (das Wichtigste ist, CONTENT_URI zu definieren, CONTENT_URI ist ein Uri-Typ, die Tatsache wird durch String-Parsing ermittelt)

//定义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. Definieren Sie eine Klasse, die ContentProvider erbt

3. Implementieren Sie die Methoden query, insert, update, delete, getType und onCreate

(1). Definieren Sie 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). Überschreiben Sie die getType-Methode

// 根据传入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). Erstellen Sie ein statisches UserProjectMap-Hash-Map-Objekt

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). Einfügemethode neu schreiben

// 该方法返回值是一个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) Abfragemethode neu schreiben

@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. Deklarieren Sie

<provider
      android:name="com.example.firstcontent.FirstContentProvider"
      android:authorities="com.example.first.firstcontent.FirstContentProvider" >
    </provider>
in AndroidManifest.xml. Ich hoffe, es kann allen helfen.

Weitere Artikel zur Implementierung von Android ContentProvider und einfache Beispielcodes finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn