登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 280|回复: 4

android存储方式之ContentProvider存储方式讲解,contentprovider详解

[复制链接]

323

主题

684

帖子

725

安币

手工艺人

发表于 2017-11-20 11:51:20 | 显示全部楼层 |阅读模式

        

        android的五种存储方式分别是:

        1,SharedPreferences

        2,file

        3,sqlite

        4,contentproviter

        5,http


ContentProvider

        注意:

        大多数ContentProvider使用Android文件系统或者SQLite数据库来保持数据,但是也可以以任何方式来存储。

        在清单文件中注册一个自定义ContentProviter

[Java] 查看源文件 复制代码

        

        重写一个TestContentProvider类继承ContentProviter

[Java] 查看源文件 复制代码
public class TestContentProvider extends ContentProvider {

    //这里的AUTHORITY就是我们在AndroidManifest.xml中配置的authorities
    public static final String AUTHORITY = "com.lh.knowledge.contentprovider";

    //匹配成功后的匹配码
    private static final int MATCH_ALL_CODE = 100;
    private static final int MATCH_ONE_CODE = 101;
    private static UriMatcher uriMatcher;//uri匹配器
    private Cursor cursor = null;//游标

    List testBeanList = new ArrayList<>();

    @Override
    public boolean onCreate() {
        initData();
        //添加要匹配的uri,匹配不成功返回NO_MATCH(-1)
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        /**
         * uriMatcher.addURI(authority, path, code); 其中
         * authority:主机名(用于唯一标示一个ContentProvider,这个需要和清单文件中的authorities属性相同)
         * path:路径路径(可以用来表示我们要操作的数据,路径的构建应根据业务而定)
         * code:返回值(用于匹配uri的时候,作为匹配成功的返回值)
         */
        uriMatcher.addURI(AUTHORITY, &quot;student&quot;, MATCH_ALL_CODE);// 匹配记录集合
        uriMatcher.addURI(AUTHORITY, &quot;student/#&quot;, MATCH_ONE_CODE);// 匹配单条记录
        return false;
    }

    private void initData() {
        TestBean testBean1 = new TestBean();
        testBean1.setId(1);
        testBean1.setName(&quot;aaa&quot;);
        testBean1.setPrice(5.2);
        testBean1.setSex(false);
        testBeanList.add(testBean1);

        TestBean testBean2 = new TestBean();
        testBean1.setId(2);
        testBean1.setName(&quot;bbb&quot;);
        testBean1.setPrice(6.2);
        testBean1.setSex(true);
        testBeanList.add(testBean2);

        TestBean testBean3 = new TestBean();
        testBean1.setId(3);
        testBean1.setName(&quot;ccc&quot;);
        testBean1.setPrice(0.2);
        testBean1.setSex(false);
        testBeanList.add(testBean3);
    }

    /**
     * @param uri
     * @param projection
     * @param selection
     * @param selectionArgs
     * @param sortOrder
     * @return
     */
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        //这里的查询需要配合sqlite来使用
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        int match = uriMatcher.match(uri);
        if (match != MATCH_ALL_CODE) {//这里不能匹配集合,只能匹配单个
            throw new IllegalArgumentException(&quot;Unkwon Uri:&quot; + uri.toString());
        }
        //
        int indexId = values.getAsInteger(&quot;indexId&quot;);
        Uri insertUri = ContentUris.withAppendedId(uri, indexId);
        if (indexId > 0) {
            TestBean testBean = new TestBean();
            testBean.setId(indexId);
            testBean.setName(&quot;content provider userid &quot; + indexId);
            testBeanList.add(testBean);
            return insertUri;
        }
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        //匹配uri
        switch (uriMatcher.match(uri)) {
            case MATCH_ALL_CODE://集合
                int i = testBeanList.size();
                testBeanList.clear();
                return i;
            case MATCH_ONE_CODE://单个
                int postion = Integer.parseInt(selection);
                testBeanList.remove(postion);
                return 1;
            default://抛出异常,没有匹配到uri
                //throw new IllegalArgumentException(&quot;Unkwon Uri:&quot; + uri.toString());
                return 0;
        }
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        int postion = Integer.parseInt(selection);
        if (postion > testBeanList.size() - 1) return 0;
        TestBean testBean = testBeanList.get(postion);
        if (testBean == null) return 0;
        String name = values.getAsString(&quot;name&quot;);
        testBean.setName(name);
        return 1;
    }
}

        如何使用ContentProvider来存储数据

[Java] 查看源文件 复制代码
public class ContentProviderActivity extends Activity {

    private ContentResolver contentResolver;
    private final Uri STUDENT_ALL_URI = Uri.parse(&quot;content://&quot; + TestContentProvider.AUTHORITY + &quot;/student&quot;);
    private final Uri STUDENT_ONE_URI = Uri.parse(&quot;content://&quot; + TestContentProvider.AUTHORITY + &quot;/student/#&quot;);

    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            //这里说明内容提供者的uri正确,随机操作增删改查
            /**
             * @param uri
             * @param projection
             * @param selection
             * @param selectionArgs
             * @param sortOrder
             * @return cursor
             */
            Cursor cursorAll = contentResolver.query(STUDENT_ALL_URI, null, null, null, null);
            //查询userid为1的用户
            Cursor cursorOne = contentResolver.query(STUDENT_ONE_URI, null, &quot;1&quot;, null, null);
            //删除userid为2的用户,返回当前删除条数
            int i = contentResolver.delete(STUDENT_ONE_URI, &quot;2&quot;, null);
            //修改
            ContentValues contentValues = new ContentValues();
            contentValues.put(&quot;name&quot;, &quot;test&quot;);
            int updateNumber = contentResolver.update(STUDENT_ONE_URI, contentValues, &quot;1&quot;, null);
            //这里的方法都与TestContentProvider中的方法相对应
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获得内容提供者解析器
        contentResolver = getContentResolver();
        //注册内容观察者
        contentResolver.registerContentObserver(STUDENT_ALL_URI, true, new PersonOberserver(handler));
    }

    /**
     * 观察者,如果找到了当前uri的提供者,则会回调
     */
    public class PersonOberserver extends ContentObserver {

        private Handler handler;

        public PersonOberserver(Handler handler) {
            super(handler);
            this.handler = handler;
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            //向handler发送消息,找到了当前的提供者
            Message msg = new Message();
            handler.sendMessage(msg);
        }

    }

        ContentProviter能够跨进程的存储数据,通过调用相对应的方法能够增、删、改、查。


                                               

9

主题

9274

帖子

1798

安币

Android大神

Rank: 6Rank: 6

发表于 2017-11-20 23:06:21 | 显示全部楼层
支持楼主,支持安卓巴士!

0

主题

9195

帖子

1163

安币

Android大神

Rank: 6Rank: 6

发表于 2017-11-21 16:01:22 | 显示全部楼层
感谢大神~

17

主题

8963

帖子

2352

安币

Android大神

Rank: 6Rank: 6

发表于 2017-11-22 13:11:22 | 显示全部楼层
每次我都积极回帖的,想要安币~

10

主题

9540

帖子

869

安币

代码手工艺人

Rank: 4

发表于 2017-11-23 14:37:26 | 显示全部楼层
支持楼主,支持安卓巴士!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表