Android中内容提供者ContentProvider实现数据库增删改查
1.我们首先new一个我们自己的类集成ContentProvider,并实现方法如下
package com.wzw.sqllitedemo.providers; import com.wzw.sqllitedemo.db.PersonSQLiteOpenHelper; 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 PersonContentProvider extends ContentProvider { private static UriMatcher uriMatcher; private static final String authority="com.wzw.sqllitedemo.providers.PersonContentProvider"; private static final int PERSON_INSERT_CODE = 0; private static final int PERSON_DELETE_CODE = 1; private static final int PERSON_UPDATE_CODE = 2; private static final int PERSON_QUERYALL_CODE = 3; private PersonSQLiteOpenHelper mOpenHelper; static{ uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); //添加uri(分机号) //content://com.wzw.sqllitedemo.providers.PersonContentProvider/person/insert uriMatcher.addURI(authority, "person/insert", PERSON_INSERT_CODE); uriMatcher.addURI(authority, "person/delete", PERSON_DELETE_CODE); uriMatcher.addURI(authority, "person/update", PERSON_UPDATE_CODE); uriMatcher.addURI(authority, "person/queryAll", PERSON_QUERYALL_CODE); } @Override public boolean onCreate() { mOpenHelper=new PersonSQLiteOpenHelper(getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { switch (uriMatcher.match(uri)) { case PERSON_QUERYALL_CODE: SQLiteDatabase db=mOpenHelper.getReadableDatabase(); if(db.isOpen()){ Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder); return cursor; // db.close();返回cursor结果集时不能关闭数据库 } break; default: throw new IllegalArgumentException("uri不匹配"); } return null; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { switch (uriMatcher.match(uri)) { case PERSON_INSERT_CODE: //添加人到person表中 SQLiteDatabase db = mOpenHelper.getWritableDatabase(); if (db.isOpen()) { long id = db.insert("person", null, values); db.close(); //返回的类型为content://com.wzw.sqllitedemo.providers.PersonContentProvider/person/insert/id return ContentUris.withAppendedId(uri, id); } break; default: throw new IllegalArgumentException("uri不匹配"); } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { switch (uriMatcher.match(uri)) { case PERSON_DELETE_CODE: //在person中删除数据 SQLiteDatabase db = mOpenHelper.getWritableDatabase(); if(db.isOpen()){ int count=db.delete("person", selection, selectionArgs); db.close(); return count; } break; default: throw new IllegalArgumentException("uri不匹配"+uri); } return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { switch (uriMatcher.match(uri)) { case PERSON_UPDATE_CODE: //更新person表 SQLiteDatabase db = mOpenHelper.getWritableDatabase(); if(db.isOpen()){ int count=db.update("person", values, selection, selectionArgs); db.close(); return count; } break; default: throw new IllegalArgumentException("uri不匹配"+uri); } return 0; } }
在清单文件中声明
<!-- 清单文件中声明ContextProvider --> <provider android:name="com.wzw.sqllitedemo.providers.PersonContentProvider" android:authorities="com.wzw.sqllitedemo.providers.PersonContentProvider"> </provider>
2.然后我们在新建一个工程来测试
新建一个junit测试类
package com.wzw.other; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.AndroidTestCase; import android.util.Log; public class TestCase extends AndroidTestCase { private String tag="TestCase"; public void testInsert(){ //另外一个程序的uri Uri uri = Uri.parse("content://com.wzw.sqllitedemo.providers.PersonContentProvider/person/insert"); //获取内容提供者访问对象 ContentResolver resolver = getContext().getContentResolver(); ContentValues values = new ContentValues(); values.put("name","meimei"); values.put("age", 18); Log.i(tag, "uri"+uri); uri = resolver.insert(uri, values); long id = ContentUris.parseId(uri); Log.i(tag, "插入的id"+id); } public void testDelete(){ //另外一个程序的uri Uri uri = Uri.parse("content://com.wzw.sqllitedemo.providers.PersonContentProvider/person/delete"); //获取内容提供者访问对象 ContentResolver resolver = getContext().getContentResolver(); String where = "_id=?"; String[] selectionArgs={"8"}; int count = resolver.delete(uri, where, selectionArgs); Log.i(tag, "删除了"+count); } public void tesUpdate(){ //另外一个程序的uri Uri uri = Uri.parse("content://com.wzw.sqllitedemo.providers.PersonContentProvider/person/update"); //获取内容提供者访问对象 ContentResolver resolver = getContext().getContentResolver(); ContentValues values=new ContentValues(); values.put("name", "lisi"); int count = resolver.update(uri, values, "_id=?", new String[]{"9"}); Log.i(tag, "更新了:"+count); } public void testQueryAll(){ //另外一个程序的uri Uri uri = Uri.parse("content://com.wzw.sqllitedemo.providers.PersonContentProvider/person/queryAll"); //获取内容提供者访问对象 ContentResolver resolver = getContext().getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{"_id","name","age"}, null, null, "_id"); if(cursor!=null&&cursor.getCount()>0){ int id; String name; int age; while(cursor.moveToNext()){ id=cursor.getInt(0); name=cursor.getString(1); age=cursor.getInt(2); Log.i(tag, "id:"+id+"name:"+name+"age:"+age); } cursor.close(); } } }
把第一个工程部署以后。内容提供者就在手机中存在了,然后用第二个工程来测试他。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。