Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
我们可以在其他应用程通过那些ContentProvider(已经注册到系统)获取这些数据.
下面看一个简单的demo,了解一下在程序中我们如何写自己的ContentProvider
下面是代码:
package com.hithink.datongwms.contentprovider;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.hithink.datongwms.app.AppContext;
/**
* 内容提供者,将自己的数据提供给其他的应用
* Created by 大漠dreamer on 2018/7/24.
*/
public class MyContentProvider extends ContentProvider {
private static final String CONTENT = "contact";
private static final String DATABASE_NAME = "contact.db";
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int CONTACT = 1;
/**
* 静态代码块
*/
static {
uriMatcher.addURI("com.hithink.datongwms", CONTENT, CONTACT);
}
private MyDbHelper dbHelp;
private ContentResolver contentResolver;
@Override
public boolean onCreate() {
Context context = AppContext.getInstance();
contentResolver = context.getContentResolver();
//创建数据库
dbHelp = new MyDbHelper(context, DATABASE_NAME, null, 1);
return true;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Uri uri1 = null;
if (uriMatcher.match(uri) == CONTACT) {
SQLiteDatabase database = dbHelp.getWritableDatabase();
long d = database.insert(CONTENT, "_id", values);
uri1 = ContentUris.withAppendedId(uri, d);
contentResolver.notifyChange(uri1, null);
}
return uri1;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
int id = 0;
if (uriMatcher.match(uri) == CONTACT) {
SQLiteDatabase database = dbHelp.getWritableDatabase();
id = database.delete(CONTENT, selection, selectionArgs);
contentResolver.notifyChange(uri, null);
}
return id;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
@Nullable String[] selectionArgs, @Nullable String sortOrder) {
Cursor cursor = null;
if (uriMatcher.match(uri) == CONTACT) {
SQLiteDatabase database = dbHelp.getReadableDatabase();
cursor = database.query(CONTENT, projection, selection,
selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(contentResolver, uri);
}
return cursor;
}
/**
* 利用android自带的SQLite进行数据库的操作
*/
private static class MyDbHelper extends SQLiteOpenHelper {
MyDbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库
String sql = "create table contact(_id integer primary key autoincrement," +
"name text not null,number text not null);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
}
}
因为ContentProvider为四大组件之一,所以需要在Manifest.xml进行注册,注册代码如下:
<provider
android:name=".contentprovider.MyContentProvider"
android:authorities="com.hithink.datongwms"
android:enabled="true"
android:exported="true" />