标签:
1、ContentProvider是什么?
ContentProvider在android中的作用是对外共享数据,你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对你应用中的数据进行添删改查。
2、ContentResolver是什么?
当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。
3、Uri是什么?
Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。
2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
? 要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
? 要操作contact表中id为10的记录的name字段, contact/10/name
? 要操作contact表中的所有记录,可以构建这样的路径:/contact
A : 是一个前缀,表示是由ContentProvider提供,固定不变
B : authority, 标识是哪个Provider,不同的Provider此部分必须不同。
C : 对应于哪张表 student
D : id值, 对应表中的哪条记录
------------------------小案例开始————————————————1、AndroidManifest.xml(在该文件中填入provider组件,主要是看红色部分)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.l09_contentprovider" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.l09_contentprovider.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <span style="color:#ff0000;"><strong> <provider android:name="com.example.l09_contentprovider.MyContentProvider" android:authorities="com.example.l09_contentprovider.mycontentprovider" android:exported="true" > </provider></strong></span> </application> </manifest>接下来是案例的布局文件(很简单就4个button)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="insert" android:onClick="insert"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="delete" android:onClick="delete" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="update" android:onClick="update" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="query" android:onClick="query"/> </LinearLayout>
接下来是DBHelper.java(这个类是创建数据库,数据表,并且初始化一些数据的准备工作的)
package com.example.l09_contentprovider; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) { //初始化创建数据库 super(context, "atguigu.db", null, 1); } /* * 第一次链接数据库,如果数据库文件未创建,系统自动创建数据库文件, * onCreate方法就会自动调用,并且只调用一次 */ @Override public void onCreate(SQLiteDatabase db) { //创建数据表,并且添加三条数据 db.execSQL("create table student(_id integer primary key autoincrement,name)"); db.execSQL("insert into student(name)values('Tom1')"); db.execSQL("insert into student(name)values('Tom2')"); db.execSQL("insert into student(name)values('Tom3')"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }MyContentProvider.java
package com.example.l09_contentprovider; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.util.Log; public class MyContentProvider extends ContentProvider { // 创建内容提供者(在AndroidManifest.xml注册) //com.example.l09_contentprovider.mycontentprovider private static final String AUTHORITY = "com.example.l09_contentprovider.mycontentprovider"; // 初始化UriMatcher--static赋值使用--UriMatcher类用于匹配Uri private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { //方法格式:uriMatcher.addURI(authority, path, code) // content://com.example.l09_contentprovider.mycontentprovider/student 不带记录 uriMatcher.addURI(AUTHORITY, "student", 2); // #代表匹配任意数字 // content://com.example.l09_contentprovider.mycontentprovider/student/3 带记录的 uriMatcher.addURI(AUTHORITY, "student/#", 3); } // 应用启动就会调用构造方法 public MyContentProvider() { Log.e("TAG", "provider MyContentProvider() "); } /** * 创建的时候获取数据库链接 */ private DBHelper dbHelper; @Override public boolean onCreate() { // 获取context对象,得到数据库链接 dbHelper = new DBHelper(getContext()); // 正确的加载了 return true; } /** * 执行插入操作 */ //insert方法中发送插入改变的通知,通知所有监听在此URL上 private static final Uri URI = Uri.parse("content://com.example.l09_contentprovider.mycontentprovider/student"); @Override public Uri insert(Uri uri, ContentValues values) { // 获取标示 int code = uriMatcher.match(uri); // 获取数据库链接 SQLiteDatabase database = null; if (code == 2) { database = dbHelper.getReadableDatabase(); // 指定列为空 long id = database.insert("student", null, values); /* * 解析uri的工具类--添加id到指定的uri中 生成当前记录的uri---重新赋值 */ uri = ContentUris.withAppendedId(uri, id); database.close(); //发送改变的通知!!!!!!!!! getContext().getContentResolver().notifyChange(URI, null);//通知所有监视在URI上 } else { database.close(); throw new RuntimeException("uri格式不对"); } // 返回传递过来的uri return uri; } @Override public String getType(Uri uri) { return null; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 匹配uri, 得到标识code int code = uriMatcher.match(uri); SQLiteDatabase database = dbHelper.getReadableDatabase(); Cursor cursor = null; if (code == 2) { // 不是根据id查询 cursor = database.query("student", projection, selection, selectionArgs, null, null, sortOrder); } else if (code == 3) { // 是根据id查询 long id = ContentUris.parseId(uri); cursor = database.query("student", projection, "_id=" + id, null, null, null, null); } else { throw new RuntimeException("uri格式不正确"); } //如果数据库链接关闭不能获取数据 // database.close(); return cursor; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 标示 int code = uriMatcher.match(uri); int deleteCount = -1; // 获取链接 SQLiteDatabase database = dbHelper.getReadableDatabase(); // 不是根据id删除 if (code == 2) { deleteCount = database.delete("student", selection, selectionArgs); // 根据id删除 } else if (code == 3) { long id = ContentUris.parseId(uri); deleteCount = database.delete("student", "_id=" + id, null); } else { throw new RuntimeException("uri格式不正确"); } return deleteCount; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int updateCount = -1; // 匹配uri, 得到标识code int code = uriMatcher.match(uri); // 得到数据库连接 SQLiteDatabase database = dbHelper.getReadableDatabase(); if (code == 2) { // 不是根据id更新 updateCount = database.update("student", values, selection, selectionArgs); } else if (code == 3) { // 是根据id更新 long id = ContentUris.parseId(uri); updateCount = database.update("student", values, "_id=" + id, null); } else {// 其它的都不是 throw new RuntimeException("uri格式不正确"); } database.close(); return updateCount; } }
package com.example.l09_contentprovider; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends Activity { //定义一个内容监听者,用来监听数据改变 private ContentObserver observer = new ContentObserver(null) { public void onChange(boolean selfChange) { // 说明数据有改变,重新查询一直所有记录 Uri uri = Uri .parse("content://com.example.l09_contentprovider.mycontentprovider/student"); Cursor cursor = contentResolver.query(uri, null, null, null, null); Log.e("TAG", "onChange() count=" + cursor.getCount()); }; }; //ContentResolver是通过URI来查询ContentProvider中提供的数据 private ContentResolver contentResolver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //加载布局文件 setContentView(R.layout.activity_main); //创建ContentResolver contentResolver = this.getContentResolver(); // 注册内容观察者 Uri uri = Uri .parse("content://com.example.l09_contentprovider.mycontentprovider"); // notifyForDescendents 是否模糊匹配, true: 不精确, 匹配当前路径级其子路径 contentResolver.registerContentObserver(uri, true, observer); } /** * 通过contentResover 调用contentProvider来执行方法 */ public void insert(View view) { Uri uri = Uri .parse("content://com.example.l09_contentprovider.mycontentprovider/student"); // 准备要插入的数据 ContentValues values = new ContentValues(); values.put("name", "Tom4"); // 指定向表插入数据 Uri uri2 = contentResolver.insert(uri, values); // 插入完毕进行土司提示 Log.e("TAG", uri2.toString()); } /** * 通过contentResover 调用contentProvider来执行删除方法 通过id来进行删除 */ public void delete(View view) { Uri uri = Uri .parse("content://com.example.l09_contentprovider.mycontentprovider/student/1"); int deleteCount = contentResolver.delete(uri, null, null); Log.e("TAG", "deleteCount" + deleteCount); } /** * 通过contentResover 调用contentProvider来执行查询方法 */ public void query(View view) { //????????????? Uri uri = Uri .parse("content://com.example.l09_contentprovider.mycontentprovider/student"); Cursor cursor = contentResolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(0); String name = cursor.getString(cursor.getColumnIndex("name")); Log.e("TAG", id + "" + name); } Log.e("TAG", "count:" + cursor.getCount()); cursor.close(); } /** * 通过contentResover 调用contentProvider来执行更新方法 通过id来进行更新 */ public void update(View view) { Uri uri = Uri .parse("content://com.example.l09_contentprovider.mycontentprovider/student/2"); ContentValues values = new ContentValues(); values.put("name", "wyf"); int updateCount = contentResolver.update(uri, values, null, null); Log.e("TAG", "updateCount=" + updateCount); } /** * 通过contentResover 调用contentProvider来执行更新方法 不通过id来进行更新 * 或者下面的方法 */ public void update1(View view) { Uri uri = Uri .parse("content://com.example.l09_contentprovider.mycontentprovider/student"); ContentValues values = new ContentValues(); values.put("name", "xfzhang2"); int updateCount = contentResolver.update(uri, values, "name=?", new String[] { "xfzhang" }); Log.e("TAG", "updateCount=" + updateCount); } }
标签:
原文地址:http://blog.csdn.net/u013210620/article/details/44223139