android ContentProvider

来源:互联网 发布:南京连天美正规吗 知乎 编辑:程序博客网 时间:2024/05/29 02:19
  android ContentProvider 用法
//1 构建类 继承ContentProvider
public class MyContentProvider extends ContentProvider{
//2实现相关方法:onCreate,query,getType,insert,delete,update 分别实现增删改查等数据库操作
//3 初始化相关属性
 private static final String URI_AUTHORITY = "com.tianqi2345.contentprovider1";
    public static final String URI_PATH = "RecordSet"; // 只是填充,没有作用
    public static final String URI_PATH2 = "RecordSet/#";// 只是填充,没有作用
    public static final String URI_INSERT = "RecordInsert"; // 只是填充,没有作用
    public static final String URI_DELETE = "RecordDelete/#";
    public static final String URI_UPDATE = "Update/#";
    
    private static final UriMatcher sMatcher;
    public static final int ALL_EVENT_RECORDS = 0;
    public static final int ONE_Event_RECORD = 1;
    public static final int ONE_INSERT = 2;
    public static final int ONE_DELETE = 3;
    public static final int UPDATE_DATA = 4;
    
    // 静态域初始化静态变量,设置匹配URI


    static {
        sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        sMatcher.addURI(URI_AUTHORITY, URI_PATH2, ONE_Event_RECORD);
        sMatcher.addURI(URI_AUTHORITY, URI_PATH, ALL_EVENT_RECORDS);
        sMatcher.addURI(URI_AUTHORITY, URI_INSERT, ONE_INSERT);
        sMatcher.addURI(URI_AUTHORITY, URI_DELETE, ONE_DELETE);
        sMatcher.addURI(URI_AUTHORITY, URI_UPDATE, UPDATE_DATA);
    }
//上下文变量
    private Context mContext;


    @Override
    public boolean onCreate() {
        mContext = getContext();
        return true;
    }
//查询
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        int match = sMatcher.match(uri);
        Cursor cur = null;
//根据uri区分查询类型
        switch (match) {
        case ALL_EVENT_RECORDS:
//查询所有内容
            cur = loadAllCalendarEvent(this);
            break;
        case ONE_Event_RECORD:
//根据id和条件查询指定内容
            cur = loadCalendarEvent(this, ContentUris.parseId(uri), uri,
                    projection, selection, selectionArgs, sortOrder);
            break;
        default:
            break;
        }
        return cur;
    }


    private Cursor loadCalendarEvent(MyContentProvider myContentProvider,
            long parseId, Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        // 客户端传来查询字符串,搜索条件以及排序条件,提供者根据条件查询数据库表返回结果
        SQLiteOpenHelper dbHelper = new SqliteDBHelper(mContext);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String where = "_id = " + parseId;
        if (selection != null && !"".equals(selection)) {
            where = where + " and " + selection;
        }
        Cursor cu = db.query("citys", projection, where, selectionArgs, null,
                null, sortOrder);
        return cu;
    }


    private Cursor loadAllCalendarEvent(MyContentProvider calendarProvider) {
        try {
            SQLiteOpenHelper dbHelper = new SqliteDBHelper(mContext);
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            Cursor cursor = db.rawQuery("select * from citys", null);
            return cursor;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    public String getType(Uri uri) {
        return null;
    }
//插入操作
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteOpenHelper dbHelper = new SqliteDBHelper(mContext);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Uri insertUri = null;
        int match = sMatcher.match(uri);
        if (match == ONE_INSERT) {
            // 插入一个字段
            long rowid = db.insert("citys", null, values);
            insertUri = ContentUris.withAppendedId(uri, rowid);
        } else {
            insertUri = null;
        }
        return insertUri;
    }
//删除操作
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteOpenHelper dbHelper = new SqliteDBHelper(mContext);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int count = 0;
        if (sMatcher.match(uri) == ONE_DELETE) {
            // 提取出id部分
            long id = ContentUris.parseId(uri);
            String where = "_id = " + id;
            // 如果用户delete里面传递了参数,判断参数如果存在就拼起来
            if (selection != null && !"".equals(selection)) {
                where = where + " and " + selection;
            }
            count = db.delete("citys", where, selectionArgs);
        }
        return count;
    }
//修改操作
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        int count = 0;
        SQLiteOpenHelper dbHelper = new SqliteDBHelper(mContext);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
         if (sMatcher.match(uri) == UPDATE_DATA) {
            long id = ContentUris.parseId(uri);
            String where = "_id = " + id;
            if (selection != null && !"".equals(selection)) {
                where = where + " and " + selection;
            }
            count = db.update("citys", values, where, selectionArgs);
        } else {
            count = 0;
        }
        return count;
    }


}


4 在xml中注册ContentProvider
//类名,uri
<provider
            android:name="com.tianqi2345.contentprovider.MyContentProvider"
            android:authorities="com.tianqi2345.contentprovider1" >
        </provider>
客户端访问ContentProvider
1 带参数查询指定id和条件的内容
private void queryContentProvider(MainActivity mainActivity, int i) {
        //uri通常有唯一报名和条件组成
Uri uri = Uri
                .parse("content://com.tianqi2345.contentprovider1/RecordSet/" + 0);
        Cursor cursor = getContentResolver().query(uri, null, "_id=?",
                new String[] { "0" }, null);
        Log.e("LXL", "count = " + cursor.getCount());
        while (cursor.moveToNext()) {
            String id = cursor.getString(cursor.getColumnIndex(cursor
                    .getColumnName(0)));
            String name = cursor.getString(cursor.getColumnIndex(cursor
                    .getColumnName(1)));
            String name2 = cursor.getString(cursor.getColumnIndex(cursor
                    .getColumnName(2)));
            Log.e("result data: ", id + "," + name + "," + name2);
        }
    }
//查询所有内容,不含参数
    private void queryContentProvider(MainActivity mainActivity) {
        Uri uri = Uri
                .parse("content://com.tianqi2345.contentprovider1/RecordSet");
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        Log.e("LXL", "count = " + cursor.getCount());
        while (cursor.moveToNext()) {
            String id = cursor.getString(cursor.getColumnIndex(cursor
                    .getColumnName(0)));
            String name = cursor.getString(cursor.getColumnIndex(cursor
                    .getColumnName(1)));
            String name2 = cursor.getString(cursor.getColumnIndex(cursor
                    .getColumnName(2)));
            Log.e("result data: ", id + "," + name + "," + name2);
        }
    }


   //修改指定数据
    private void updateContentProvider(MainActivity mainActivity, int i) {
        Uri uri = Uri
                .parse("content://com.tianqi2345.contentprovider1/Update/" + 12);
        ContentValues values = new ContentValues();
        values.put("areaId", "111");
        values.put("pinyin", "dongjie");
        values.put("py", "dj");
        values.put("areaName", "dongjie");
        values.put("cityName", "dongjie");
        values.put("provinceName", "dongjie");
        int count = getContentResolver().update(uri, values, null, null);
        Log.e("LXL", "count="+count);
    }
    //删除指定数据
    private void deleteContentProvider(MainActivity mainActivity, int i) {
        Uri uri = Uri
                .parse("content://com.tianqi2345.contentprovider1/RecordDelete/" + 12);
        getContentResolver().delete(uri, null, null);
    }
//插入指定数据
    private void insertContentProvider(MainActivity mainActivity) {
        Uri uri = Uri
                .parse("content://com.tianqi2345.contentprovider1/RecordInsert");
        ContentValues values = new ContentValues();
        // areaId integer, pinyin text, py text, areaName text, cityName text,
        // provinceName text
        values.put("areaId", "111");
        values.put("pinyin", "dongjie");
        values.put("py", "dj");
        values.put("areaName", "dongjie");
        values.put("cityName", "dongjie");
        values.put("provinceName", "dongjie");
        Uri ui = getContentResolver().insert(uri, values);
        Log.e("LXL", "" + ui);
    }
0 0
原创粉丝点击