import java.util.ArrayList; import java.util.List; import java.util.Set; import com.zero.zhidingyiprovider.db.MyOpenHelper; //这个是我自己的数据库,要使用Provider要自己写一个数据库 import android.annotation.SuppressLint; 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.widget.Switch; /** * 自定义一个简单的ContentProvider * * @author zero * */ public class MyContentProvider extends ContentProvider { private SQLiteDatabase db; // 实例化一个URI的过滤器 过滤正确的URL private static final UriMatcher URI_MATCHER = new UriMatcher( UriMatcher.NO_MATCH); // 认证(作为唯一标示) public static final String AUTHORITY = "com.zero.zhidingyiprovider.mycontentprovider"; // 匹配后 ——返回类型 // 女孩编号 private static final int GIRL_CODE = 1; // 女孩名字 private static final int GIRL_NAME = 2; // 匹配所有女孩 private static final int GIRLS = 3; static { /** * path 是表名。作为路径标示 code 返回码 3中uri */ // 匹配编号 URI_MATCHER.addURI(AUTHORITY, "fancygirl/#", GIRL_CODE); // 匹配名字 URI_MATCHER.addURI(AUTHORITY, "fancygirl/*", GIRL_NAME); // 匹配所有女孩 URI_MATCHER.addURI(AUTHORITY, "fancygirls", GIRLS); // 查询的Uri // URI_MATCHER.addURI(AUTHORITY, "fancygirls/in/insert", GIRLS_insert); // URI_MATCHER.addURI(AUTHORITY, "fancygirl/#", code); #表示匹配数字 *表示任意字符 // content://contacts/person // 下面就是用包名做唯一标示 /* * Uri parse = Uri * .parse("content://com.zero.zhidingyiprovider.mycontentprovider/fancygirl" * ); int code = URI_MATCHER.match(parse);// code就是前两个值匹配的返回值 */ } /** * * main Thread 主线程: onCreate方法在主线程中,不能执行耗时操作 * * 返回值:当操作成功时,返回true 否则false * * * @Override */ public boolean onCreate() { // 初始化一个openHelper MyOpenHelper oh = new MyOpenHelper(getContext()); db = oh.getWritableDatabase(); return false; } /** * 查询 Uri 用于标示请求来源 projection 需要查询的字段, null 标示默认查询所有字段 selection 选择语句 列如: * name like %1% 就是所有含有1的name的数据 selectionArgs 匹配前面的?(通配符)注意顺序 sortOrder 排序 * 例如: 需要按照age排序,就传入age * * @Override */ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub /** * 判断uri满足哪个条件的 */ int match = URI_MATCHER.match(uri); switch (match) { case GIRL_CODE: // 通过code查找数据 // 查找数据库之前 获取code 通过ContentUris 获取id long parseId = ContentUris.parseId(uri); return db.query("fancyGirl", projection, "_id=?", new String[] { parseId + "" }, null, null, sortOrder); case GIRL_NAME: // content://com.zero.zhidingyiprovider.mycontentprovider/fancygirl/jack // -->标示要查出名字是jack的女孩 // Segments 块 /** * (集合直接从路径开始算起) 这个集合 第一个数据: fancygirl 第二个数据: jack */ List<String> pathSegments = uri.getPathSegments(); // 确保取的是最后一个 String string = pathSegments.get(pathSegments.size() - 1); return db.query("fancyGirl", projection, "name=?", new String[] { string }, null, null, null); case GIRLS: // 返回所有女孩 return db.query("fancyGirl", projection, selection, selectionArgs, null, null, sortOrder); default: throw new IllegalArgumentException("参数错误!"); } } /** * * 这个操作返回的Uri是插入条目的Uri * * @Override */ @SuppressLint("NewApi") public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub int match = URI_MATCHER.match(uri); switch (match) { case GIRLS: // 返回值 就是新插入数据对应的_id long insert = db.insert("fancyGirl", null, values); if (insert > 0) { /* * Set<String> keySet = values.keySet(); * * StringBuffer sb = new StringBuffer(); ArrayList<String> * vaList = new ArrayList<String>(); * * for(String key : keySet){ * Object v = values.get(key); * vaList.add(v.toString()); * sb.append(key+"=?"); * } * sb.delete(sb.length()-4, sb.length()); //上面的内容就是查询出nama * 和age,这种方式保证了扩展性 Cursor cursor = db.query("fancyGirl", new * String[]{"_id"}, sb.toString(), (String[])vaList.toArray(), * null, null, null); * * cursor.moveToNext();//游标移动到第一行 //只有两个有用的数据, int id = * cursor.getInt(0);//每次插入之后就会有被影响的数据。只用取第一行,就是想要的 */ // 需要创建一个Uri指向插入的数据,向末尾添加一个数字(用api和字符串拼接都行) Uri contentUri = Uri.parse("content://" + AUTHORITY + "/fancygirl"); return ContentUris.withAppendedId(contentUri, /* id */insert); // 需要的uri 上面就拼接好了 } break; default: throw new IllegalArgumentException("参数错误!"); } return null; } /** * 返回值 受影响的行数 * @Override */ public int delete(Uri uri, String selection, String[] selectionArgs) { int match = URI_MATCHER.match(uri); switch (match) { case GIRL_CODE: long id = ContentUris.parseId(uri); return db.delete("fancyGirl", "_id=?", new String[]{ id+""//因为刚好uri最后就是id }); default: throw new IllegalArgumentException("参数错误!"); } } /** * 更新 * @Override */ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int match = URI_MATCHER.match(uri); switch (match) { case GIRL_CODE: long id = ContentUris.parseId(uri); return db.update("fancyGirl", values, "_id=?", new String[]{ id+"" //表示需要修改的行数的id }); default: throw new IllegalArgumentException("参数错误!"); } } /** * 判断返回类型 是集合还是item(一般不用写) * * <code>vnd.android.cursor.item</code> for a single record, * or <code>vnd.android.cursor.dir/</code> for multiple items. * @Override */ public String getType(Uri uri) { int match = URI_MATCHER.match(uri); switch (match) { case GIRL_CODE: return "vnd.android.cursor.item"; default: return "vnd.android.cursor.dir"; } } }
注:有时候需要用到实时刷新技术 if (retUri != null) { // 用requery,同一界面时,实时刷新 this.cursor.requery(); this.adapter.swapCursor(cursor); }