1.什么是内容提供者(Content Porviders)?
在以下情况下你需要使用Content Providers:
1.你想为其他应用程序提供复杂数据或文件;
2.你想允许用户从你的应用程序中拷贝复杂数据到其他的应用中
3.你想使用搜索框架提供自定义的查询建议功能
<provider android:name=".provider.LentItemsProvider" android:authorities="de.openminds.samples.cpsample.lentitems" />
content://authority/optionalPath/optionalId
package cn.edu.chd.data; /** * @author Rowand jj * *数据库信息 */ public interface DB { /** * 数据库名 */ public static final String DB_NAME = "person.db"; /** * 版本 */ public static final int DB_VERSION = 1; /** *数据库表信息 */ public interface TableInfo { public static final String TABLE_NAME = "person"; /* * 字段信息 * */ public static final String ID = "id"; public static final String NAME = "name"; public static final String ADDRESS = "address"; } }2、SqlitDBHelper:
package cn.edu.chd.sqlite; import cn.edu.chd.data.DB; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class SqliteDBHelper extends SQLiteOpenHelper { public SqliteDBHelper(Context context) { super(context,DB.DB_NAME, null,DB.DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY autoincrement,name VARCHAR(20),address VARCHAR(20))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }内容提供者定义:
package cn.edu.chd.providers; 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.text.TextUtils; import cn.edu.chd.sqlite.SqliteDBHelper; /** * @author Rowand jj * *一个简单的内容提供者示例 */ public class PersonProviders extends ContentProvider { private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); /*uri授权路径,清单文件中配置*/ private static final String AUTHORITY = "cn.edu.chd.providers.personprovider"; /*路径*/ private static final String PATH_INSERT = "insert"; private static final String PATH_DELETE = "delete"; private static final String PATH_UPDATE = "update"; private static final String PATH_QUERY = "query"; private static final String PATH_QUERY_SINGLE = "query/#";//查询单条记录,#匹配数字 /*匹配码*/ private static final int CODE_INSERT = 1; private static final int CODE_DELETE = 2; private static final int CODE_UPDATE = 3; private static final int CODE_QUERY = 4; private static final int CODE_QUERY_SINGLE = 5; private static SqliteDBHelper helper = null; private static final String TABLE = "person";//默认操作的表 static//定义匹配规则 { matcher.addURI(AUTHORITY,PATH_INSERT, CODE_INSERT); matcher.addURI(AUTHORITY,PATH_DELETE,CODE_DELETE); matcher.addURI(AUTHORITY,PATH_UPDATE,CODE_UPDATE); matcher.addURI(AUTHORITY,PATH_QUERY,CODE_QUERY); matcher.addURI(AUTHORITY,PATH_QUERY_SINGLE,CODE_QUERY_SINGLE); } @Override public boolean onCreate() { helper = new SqliteDBHelper(this.getContext());//初始化helper return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { if(matcher.match(uri) == CODE_QUERY) { SQLiteDatabase db = helper.getReadableDatabase(); Cursor c = db.query(TABLE, projection, selection, selectionArgs, null, null, sortOrder); return c; }else if(matcher.match(uri) == CODE_QUERY_SINGLE) { SQLiteDatabase db = helper.getReadableDatabase(); long id = ContentUris.parseId(uri); String where_value = " id = "+id; if(!TextUtils.isEmpty(selection)) { where_value += " and "+selection; } Cursor c = db.query(TABLE, projection, where_value, selectionArgs, null, null, sortOrder); return c; } else { throw new RuntimeException("unknown uri"); } } @Override public String getType(Uri uri) { int type = matcher.match(uri); switch (type) { case CODE_QUERY: return "vnd.android.cursor.dir/"+TABLE; case CODE_QUERY_SINGLE: return "vnd.android.cursor.item/"+TABLE; default: break; } return null; } @Override public Uri insert(Uri uri, ContentValues values) { if(matcher.match(uri) == CODE_INSERT) { SQLiteDatabase db = helper.getWritableDatabase(); long id = db.insert(TABLE, null, values); return ContentUris.withAppendedId(uri, id); } else { throw new RuntimeException("unknown uri"); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { if(matcher.match(uri) == CODE_DELETE) { SQLiteDatabase db = helper.getWritableDatabase(); return db.delete(TABLE, selection, selectionArgs); }else { throw new RuntimeException("unknown uri"); } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { if(matcher.match(uri) == CODE_UPDATE) { SQLiteDatabase db = helper.getWritableDatabase(); return db.update(TABLE, values, selection, selectionArgs); } else { throw new RuntimeException("unknown uri"); } } }使用contentResolver获取数据:
package com.example.test; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.util.Log; public class TestPesonProviders { private Context context; private static final String AUTHORITY = "cn.edu.chd.providers.personprovider"; private static final String PATH_INSERT = "insert"; private static final String PATH_DELETE = "delete"; private static final String PATH_UPDATE = "update"; private static final String PATH_QUERY = "query"; public TestPesonProviders(Context context) { this.context = context; } public void testQuery() { ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://"+AUTHORITY+"/"+PATH_QUERY); // uri = ContentUris.withAppendedId(uri, 100);//查找id为100的数据 Cursor c = resolver.query(uri,null, null, null, null); while(c.moveToNext()) { Log.i("query",c.getInt(c.getColumnIndex("id"))+c.getString(c.getColumnIndex("name"))+c.getString(c.getColumnIndex("address"))); } c.close();//cursor用完必须关闭 } public void testInsert() { ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://"+AUTHORITY+"/"+PATH_INSERT); ContentValues values = new ContentValues(); values.put("id", "100"); values.put("name","jiayou"); values.put("address","somewhere"); resolver.insert(uri, values); } public void testUpdate() { ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://"+AUTHORITY+"/"+PATH_UPDATE); ContentValues values = new ContentValues(); values.put("address","火星"); resolver.update(uri, values, "id = ?", new String[]{"100"}); } public void testDelete() { ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://"+AUTHORITY+"/"+PATH_DELETE); resolver.delete(uri, "id = ?", new String[]{100+""}); } }