初涉Android之ContentProvider
一、ContentProvider的作用,可以让其它应用访问本应用的数据
第一步:定义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; public class PersonProvider extends ContentProvider { private DBOpenHelper helper = null; private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final int PERSONS = 1; private static final int PERSON = 2; static { MATCHER.addURI("cn.hpu.edu.personprovider", "person", PERSONS); MATCHER.addURI("cn.hpu.edu.personprovider", "person/#", PERSON); } /** * 删除数据库中相应的数据 */ public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = helper.getWritableDatabase(); int num = 0; switch(MATCHER.match(uri)) { case PERSONS : num = db.delete("person", selection, selectionArgs); break; case PERSON : long rowid = ContentUris.parseId(uri); String where = " id = " + rowid; if(selection != null && !"".equals(selection.trim())) { where += " and " + selection; } num = db.delete("person", where, selectionArgs); break; default : throw new IllegalArgumentException("this is An Unkown Uri : " + uri.toString()); } return num; } @Override public String getType(Uri uri) { return null; } /** * 向内容提供者里面插入数据 */ public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = helper.getWritableDatabase(); switch(MATCHER.match(uri)) { case PERSONS: long rowid = db.insert("person", "name", values); Uri insertUri = ContentUris.withAppendedId(uri, rowid); return insertUri; default: throw new IllegalArgumentException("this is An Unknown Uri:" + uri.toString()); } } /** * 该方法只调用一次用于初始化环境 */ public boolean onCreate() { helper = new DBOpenHelper(this.getContext()); return true; } /** * 按条件查询结果集并返回游标 */ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = helper.getReadableDatabase(); switch(MATCHER.match(uri)) { case PERSONS : return db.query("person", projection, selection, selectionArgs, null, null, sortOrder); case PERSON : long rawid = ContentUris.parseId(uri); String where = " id = " + rawid; if(selection != null && !"".equals(selection.trim())) { where += " and " + selection; } return db.query("person", projection, where, selectionArgs, null, null, sortOrder); default : throw new IllegalArgumentException("this is An Unknown Uri : " + uri.toString()); } } /** * 更新数据 */ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = helper.getWritableDatabase(); int num = 0; switch(MATCHER.match(uri)) { case PERSONS : num = db.update("person", values, selection, selectionArgs); break; case PERSON : long rowid = ContentUris.parseId(uri); String where = " id = " + rowid; if(selection != null && !"".equals(selection.trim())) { where += " and " + selection; } num = db.update("person", values, where , selectionArgs); break; default : throw new IllegalArgumentException("this is An Unknown Uri : " + uri.toString()); } return num; } }
第二步:在本应用的AndroidManifest.xml里面声明Provider
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.hpu.edu" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <provider android:name=".util.PersonProvider" android:authorities="cn.hpu.edu.personprovider"></provider> <activity android:name="cn.hpu.edu.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> <uses-library android:name="android.test.runner"/> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.hpu" android:label="Tests for PersonService"></instrumentation> </manifest>
第三步:在另外一个应用里面添加如下测试:
import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.AndroidTestCase; import android.util.Log; public class TestAccessContentProvider extends AndroidTestCase { private static final String TAG = "TestAccessContentProvider"; private static final String URI = "content://cn.hpu.edu.personprovider/person"; public void testInsert() throws Exception { Uri uri = Uri.parse(URI); ContentResolver resolver = this.getContext().getContentResolver(); ContentValues values = new ContentValues(); values.put("id", 45); values.put("name", "qiernsdf"); values.put("phone", "123456789"); resolver.insert(uri, values); } public void testDelete() throws Exception { Uri uri = Uri.parse(URI + "/10"); ContentResolver resolver = this.getContext().getContentResolver(); resolver.delete(uri, null, null); } public void testUpdate() throws Exception { Uri uri = Uri.parse(URI + "/11"); ContentResolver resolver = this.getContext().getContentResolver(); ContentValues values = new ContentValues(); values.put("name" , "updateValues"); resolver.update(uri, values, null, null); } public void testFind() throws Exception { Uri uri = Uri.parse(URI); ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, " id asc"); while(cursor.moveToNext()) { Log.i(TAG ,cursor.getString(cursor.getColumnIndex("name"))); } } }
相关推荐
总的来说,《深入浅出Android——Android开发经典教材》全面覆盖了Android开发的各个方面,无论你是初涉Android开发的新手,还是寻求进阶提升的开发者,都能从中受益匪浅,为你的Android开发之路打下坚实的基础。
《Android开发深入浅出》是一本专为Android开发者量身打造的专业指南,无论你是初涉Android开发的新手,还是在该领域有一定经验的开发者,都能从中受益匪浅。这本书全面覆盖了Android平台的基础知识和高级技术,旨在...
这个压缩包中的内容,对于那些初涉Android开发或者希望深化理解Android编程的开发者来说,无疑是一份宝贵的财富。 首先,Android程序设计的核心在于理解其应用程序框架。Android提供了丰富的API和工具,让开发者...
《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的专业书籍,适合希望提升技术能力、研究源码或...无论你是初涉Android开发,还是已经有一定经验,这本书都能为你带来新的启发和提升。
《Android大话企业开发》是一份专为初涉企业级Android开发的学习者准备的宝贵资料。这份资源包含了一系列深入浅出的章节,旨在帮助开发者掌握在企业环境中开发高质量Android应用的关键技能。以下是对各文件内容的...
总的来说,《Android多媒体开发高级编程》是一本全面而深入的指南,无论你是初涉Android多媒体开发的新手,还是希望提升现有技能的开发者,都能从中受益匪浅。通过阅读这本书,你将能够熟练掌握Android平台上的...
在Android开发中,数据库是应用程序持久化数据的重要方式。这个"Android日记系统源码数据库的基本操作.zip...实际操作这些源码将是一个极好的学习经验,特别是对于那些初涉Android开发和数据库管理的程序员来说。
《深入学习Android》 在移动应用开发领域,Android操作系统占据着举足轻重...无论你是初涉Android开发,还是寻求进阶,这个资料包都将是你宝贵的参考资料,祝你在学习的道路上不断进步,成为一名优秀的Android开发者。
在IT行业中,实习项目是学习和提升技能的重要途径,尤其是对于初涉Android开发的学生和新手开发者而言。"AP17110020009-AAD:APSSDC下的当前实习项目"是一个专为Android平台设计的实习项目,旨在帮助参与者掌握...