Android 自定义Prodvider

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);
        }


你可能感兴趣的:(Provider,自定义内容提供者,实时刷新内容)