Android ContentProvider 学习归纳
来源:互联网 发布:知我无情有情歌词 编辑:程序博客网 时间:2024/06/15 03:41
一、ContentProvider 的基本概念
1、ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider接口,
同时android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。
2、Uri 类简介
Uri uri = Uri.parse("content://com.derong.provider.contactprovider/contact")
Contentprovider 中使用的查询字符串有别于标准的SQL查询。很多如Select, add, delete 等操作我们使用一种特殊的URI ,这种URI是由3个部分组成,
“content://” 代表数据路径,和一个可选的标识数据的ID。(如:content://contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录))
同时Android也提供了一些帮助类,可以使我们比较有一个直观的认识。以上这种方式也可写成Uri person = ContentUris.withAppendedId(People.CONTENT_URI, 45);然后在执行数据查询
Cursor cur = managedQuery(preson,null,null,null)
二、我们来研究如何创建Contentprovide ,以及执行增加,删除等
首先要创建自己的Contentprovider ,我们要做一下几步
2.1创建一个继承了ContentProvider父类的类
2.2 定义一个名字为CONTENT_URI 常量,你必须为其指定一个唯一的字符串值,最好的方案是以类的全名称,比如
public static final Uri CONTENT_URI = Uri.parse( “content://com.google.android.MyContentProvider”);
2.3 定义要返回给客户端的数据列表,如果使用的是sqlite 数据库,还必须为其定义一个叫_id的字段,保证每条数据的唯一性
2.4 通过使用sqlite 或者其他方式定义数据存储系统。如果要存储字节型数据,处理这种数据类型的Content Provider需要实现一个名为_data的字段
2.5 声明游标返回的数据列类型变量
2.6 这不也是重点, 查询返回一个Cursor类型的对象 。所有执行写操作的方法如insert(), update() 以及delete()都将被监听。
而且我们需要事实更新数据,所以这里我们可以通过使用ContentResover().notifyChange()方法来通知监听器关于数据更新的信息
2.7 在AndroidMenifest.xml中使用 <provider>标签来设置Content provider 否则将前功尽弃
2.8 这步为拓展,因为在数据处理中很可能使用的不是基本类型,因此在使用一些新的类型时,我们就要定义一个新的MIME类型,供ContentProvider.getType(url)来返
回。
MIME 类型有两种形式:
a.指定的单个记录的
vnd.android.cursor.item/vnd.yourcompanyname.contenttype (单个记录的MIME类型)
比如, 一个请求列车信息的URI如content://com.example.transportationprovider/trains/122 可能就会返回typevnd.android.cursor.item/vnd.example.rail这样一个MIME类型。
b.多条记录的
vnd.android.cursor.dir/vnd.yourcompanyname.contenttype (多个记录的MIME类型)
比如, 一个请求所有列车信息的URI如content://com.example.transportationprovider/trains 可能就会返回vnd.android.cursor.dir/vnd.example.rail这样一个MIME 类型
下面看下具体代码实现,定义一个Content provider 需要的Content_uri ,以及数据列
<pre name="code" class="html">public class Users { public static final String AUTHORITY = “com.derong.MyContentProvider”; // BaseColums类中已经包含了 _id字段 public static final class User implements BaseColumns { public static final Uri CONTENT_URI = Uri.parse(”content://com.derong.MyContentProvider”); // 表数据列 public static final String USER_NAME = “USER_NAME”; }}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">下面我们具体实现Content provider 类,</span><span style="color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px; background-color: rgb(255, 255, 255);">它用于从Sqlite数据库中添加和读取记录</span>
<pre name="code" class="html"><span style="background-color: rgb(255, 255, 255);">public class MyContentProvider extends ContentProvider { private SQLiteDatabase sdb; private DatabaseHelper dbHelper; private static final String DATABASE_NAME = “DataUser.db”; private static final int DATABASE_VERSION= 1; private static final String TABLE_NAME= “User”; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { //创建用于存储数据的表 db.execSQL(”Create table ” + TABLE_NAME + “( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);”); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(”DROP TABLE IF EXISTS ” + TABLE_NAME); onCreate(db); } } @Override public int delete(Uri uri, String s, String[] as) { return 0; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues contentvalues) { sdb = dbHelper.getWritableDatabase(); long rowId = sqlDB.insert(TABLE_NAME, “”, contentvalues); if (rowId > 0) { Uri rowUri = ContentUris.appendId(Users.User.CONTENT_URI.buildUpon(), rowId).build(); getContext().getContentResolver().notifyChange(rowUri, null); return rowUri; } throw new SQLException(”Failed to insert row into ” + uri); } @Override public boolean onCreate() { dbHelper = new DatabaseHelper(getContext()); return (dbHelper == null) ? false : true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); SQLiteDatabase db = dbHelper.getReadableDatabase(); qb.setTables(TABLE_NAME); Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public int update(Uri uri, ContentValues contentvalues, String s, String[] as) { return 0; }}</span>
Content Provider 的入口需要在AndroidManifext.xml中配置
<provider android:name=”MyContentProvider” android:authorities=”com.derong.MyContentProvider” />
三、到此为止我们就可以使用我们定义的Content Provider
a. 为应用增加ContentProver 访问权限
b. 通过getContentResolver() 得到ContentResolver对象
c. 对返回的Cursor 对象进行分析,得到需要的数据
d. 关闭Cursor
public class MyDemo extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
insertRecord(”zhangsan”);
displayRecords();
}
private void insertRecord(String userName) {
ContentValues values = new ContentValues();
values.put(Users.User.USER_NAME, userName);
getContentResolver().insert(Users.User.CONTENT_URI, values);
}
private void displayRecords() {
String columns[] = new String[] { Users.User._ID, Users.User.USER_NAME };
Uri myUri = Users.User.CONTENT_URI;
Cursor cur = managedQuery(myUri, columns,null, null, null );
if (cur.moveToFirst()) {
String id = null;
String userName = null;
do {
id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));
userName = cur.getString(cur.getColumnIndex(Users.User.USER_NAME));
Toast.makeText(this, id + ” ” + userName, Toast.LENGTH_LONG).show();
} while (cur.moveToNext());
}
}
}
- Android ContentProvider 学习归纳
- Android学习--ContentProvider
- Android ContentProvider学习
- Android ContentProvider学习
- Android开发:ContentProvider学习
- Android ContentProvider学习
- android学习笔记---contentProvider
- Android ContentProvider学习
- android学习 关于contentprovider
- android学习之contentProvider
- Android学习笔记-ContentProvider
- Android ContentProvider 学习总结
- Android 学习记录-contentProvider
- Android ContentProvider学习
- Android 之 ContentProvider 学习
- Android学习笔记ContentProvider
- Android学习笔记ContentProvider
- Android学习笔记ContentProvider
- 相机的工作原理
- 怦然心动的魔法整理术
- XML——基础(入门介绍)
- 抽象类与接口学习笔记
- top命令学习
- Android ContentProvider 学习归纳
- java web下spring整合hibernate怎么用junit4测试
- Java学习笔记(14.2)JavaFX Basics
- 父类事件与EditText事件冲突
- 99.从 NSObject 初始化了解 isa指针
- JAVA常用代码
- PDO概念及总结
- jquery禁用a标签,jquery禁用按钮click点击
- 方案树(Resolution Tree)