Heim > Java > javaLernprogramm > Hauptteil

Implementierung von Android ContentProvider und einfacher Beispielcode

高洛峰
Freigeben: 2017-02-07 15:47:59
Original
1489 Leute haben es durchsucht

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"; 
  } 
}
Nach dem Login kopieren

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);
  
  }
Nach dem Login kopieren

(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);
    }
  
  }
Nach dem Login kopieren

(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);
  }
Nach dem Login kopieren

(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);
    }
  }
Nach dem Login kopieren

(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;
  }
Nach dem Login kopieren

4. Deklarieren Sie

<provider
      android:name="com.example.firstcontent.FirstContentProvider"
      android:authorities="com.example.first.firstcontent.FirstContentProvider" >
    </provider>
Nach dem Login kopieren
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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!