android ContentProvider解析使用
一.1.ContentProvider为存储数据提供了统一的接口,使用ContentProvider可以使应用程序实现数据的共享
2.每隔ContentProvider都拥有一个公共的URI叫做CONTENT_URI;用于表示ContentProvider所提供的数据
3.ContentProvider提供以下函数query(), insert(); update(); delete(); getType(); onCreate();(oncreate()函数在ContentProvider启动的时候,进行启动);
4.实现ContentProvider的过程
4.1定义一个CONTENT_URI常量,用于访问ContentProvider;
4.2定义一个类,继承ContentProvider
4.3实现其函数insert();update();delete();query();getType();onCreate();
4.4不要忘记在AndroidManifest.xml中声明
下面这个类是对ContentProvider的一些定义
view plain
package net.androidla.contentprovider;
import android.net.Uri;
import android.provider.BaseColumns;
public class MyContentProviderMetaData {
public static final String AUTHORIY = "net.androidla.contentprovider.MyContentProvider";
public static final String DATABASE_NAME = "androidla.db";
public static final int DATABASE_VERSION = 1;
public static final String USERS_TABLE_NAME = "users";
public static final class UserTableMetaData implements BaseColumns {
public static final String TABLE_NAME = "users";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORIY + "/users");
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.mycontentprovider.user";
public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.mycontentprovider.user";
public static final String USER_NAME = "name";
public static final String DEFAULT_SORT_ORDER = "_id desc";
}
}
5.URI类简介
Uri代表了要操作的数据,Uri主要包含两部分信息,1是需要操作的ContentProvider,2对ContentProvider的什么数据进行操作。一个Uri有以下几部分,5.1scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://
5.2主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
5.3路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
要操作contact表中id为10的记录的name字段,contact/10/name
要操作contact表中的所有记录,可以构建这样的路径:/contact
这个是ContentProvider
view plain
package net.androidla.contentprovider;
import java.util.HashMap;
import net.androidla.contentprovider.MyContentProviderMetaData.UserTableMetaData;
import net.androidla.databasehelper.SqliteHelper;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
public class MyContentProvider extends ContentProvider {
public static final UriMatcher uriMatcher;
public static final int INCOMING_USER_COLLECTION = 1;
public static final int INCOMING_USER_SINGLE = 2;
private SqliteHelper sqliteHelper;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(MyContentProviderMetaData.AUTHORIY, "users", INCOMING_USER_COLLECTION);
uriMatcher.addURI(MyContentProviderMetaData.AUTHORIY, "users/#", INCOMING_USER_SINGLE);
}
public static HashMap<String, String> userProjectionMap;
static {
userProjectionMap = new HashMap<String, String>();
userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
}
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
return 0;
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case INCOMING_USER_COLLECTION:
return UserTableMetaData.CONTENT_TYPE;
case INCOMING_USER_SINGLE:
return UserTableMetaData.CONTENT_TYPE_ITEM;
default:
throw new IllegalArgumentException("Unknown URI" + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = sqliteHelper.getWritableDatabase();
long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
if (rowId > 0) {
Uri insertUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
getContext().getContentResolver().notifyChange(insertUserUri, null);&
补充:移动开发 , Android ,