学习 ContentProvider

怎么使用安卓的数据库

1得继承SQLiteOpenHelper,继承的类需要重写 :

一个默认构造,onCreate,onUpgrade 。3个方法;

eg: 默认构造
public MyHelper(Context context) {
    /*
     * 参数1: Context用来确定数据库存储在哪个路径下
     * 参数2: 数据库文件的名字
     * 参数3: 一个用来创建Cursor(结果集)对象的工厂
     * 参数4: 版本号, 用来判断数据库是创建还是升级(降级)
     */
    super(context, "lixiang.db" null, 1);
}
eg: onCreate 在数据库创建之后执行
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE person(id Integer PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))");  // 执行SQL语句
}
eg: onUpgrade 在数据库版本升级之后执行
@Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("ALTER TABLE person ADD balance Integer");
    }

使用数据库



一般数据库是结合ContentProvider来使用的,ContentProvider是安卓4大组件之一,需要在manifest中进行注册;

       <provider
            android:name="com.lixiang.sqlite.provider"
            android:authorities="IlixiangProvider" />
            //authorities这是一个其他应用程序可以访问这个provider的“标识”

同时,我们需要添加一个UriMatcher来跟ContentProvider一起结合使用

    public boolean onCreate() {
        //获取数据库对象
        MyHelper helper = new MyHelper(getContext());
        // 创建Uri匹配器(用来识别Uri)
        matcher = new UriMatcher(UriMatcher.NO_MATCH);
);
        //manifest 中ContentProvider的“标识”、需要操作的表名、匹配号(如果uri匹配上了会返回这个标识,在执行curd4个方法的时候会用到)
        matcher.addURI("IlixiangProvider", "person/#", PERSON_ID);
        return true;
    }
public Uri insert(Uri uri, ContentValues values) {
//matcher.match(uri)会返回一个匹配id
        switch (matcher.match(uri)) {
            case PERSON:
            //打开数据库
            SQLiteDatabase db = helper.getWritableDatabase();
            // 在values中没有数据的时候, 传null则不插入任何数据
            long id = db.insert("person", null, values);
            db.close();
            // 把id拼接在Uri后面返回
            return ContentUris.withAppendedId(uri, id);
            default:
                throw new IllegalArgumentException("无法识别的Uri: " + uri);
        }
    }

在另外一个程序中使用ContentProvider

    public void testProvider() {
        // 获取解析器(访问内容提供者的工具)
        ContentResolver resolver = getContext().getContentResolver();
        // 指定Uri, 明确要访问哪个内容提供者,IlixiangProvider这里就是manifest 中的那个标识
        Uri uri = Uri.parse("content://IlixiangProvider");
        ContentValues values = new ContentValues();
        // 执行Uri指向的内容提供者中的delete()方法
        resolver.delete(uri, null, null);
        resolver.query(uri, null, null, null, null);
        resolver.update(uri, values, null, null);
        resolver.insert(uri, values);
    }

监听数据库修改,自动刷新ui界面

eg: ContentProvider刷新代码

    public Uri insert(Uri uri, ContentValues values) {
        switch (matcher.match(uri)) {
            case PERSON:
                SQLiteDatabase db = helper.getWritableDatabase();
                long id = db.insert("person", null, values);
                //这句是刷新界面的核心代码,这个uri也可以自定义,如果自定义的话,在注册监听的时候的uri必须和这里保持一致------------------------------------------
                getContext().getContentResolver().notifyChange(uri, null);
                //------------------------------------------
                db.close();
                return ContentUris.withAppendedId(uri, id);     // 把id拼接在Uri后面返回
            default:
                throw new IllegalArgumentException("无法识别的Uri: " + uri);
        }
    }
eg: 监听UI刷新代码

        Uri uri = Uri.parse("content://IlixiangProvider/person");
        // 注册观察者(监听器)
        getContentResolver().registerContentObserver(uri , true, new ContentObserver(new Handler()) {
            public void onChange(boolean selfChange, Uri uri) {
                if (selfInsert) {                       // 判断是否是自己插入的数据
                    selfInsert = false;
                    return;
                }
                list = dao.queryAll();                  // 重新查询
                adapter.notifyDataSetChanged();         // 刷新界面
            }
        }); 
时间: 2024-10-14 21:53:30

学习 ContentProvider的相关文章

Android 四大组件学习之ContentProvider五

上几节学习了ContentProvider的实际用途,读取短信,插入短信,读取联系人,插入联系人等. 本节课在学习ContentProvider的观察者. 在生活中有第三方的软件,比如什么短信软件,此短信软件是替代了系统中自带的短信软件.当然可读取短信就是利用的ContentProvider,但是此等软件为何能实时的把接受的短信显示出来呢?  这就用到我们的内容观察者. 什么是内容观察者呢?  就是一直在观察系统是否有新短信,如果有新短信就会提示第三方软件赶快去数据库中取短信信息.这样就能实时的

步步为营_Android开发课[6]_ContentProvider学习

Focus on technology, enjoy life!-- QQ:804212028 浏览链接:http://blog.csdn.net/y18334702058/article/details/44624305 主题:ContentProvider学习 ContentProvider是什么 ContentProvider(内容提供者)是Android中的四大组件之一.主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过Con

静态代码块和构造器的执行顺序

这段时间在学习ContentProvider,还是不太明白ContentProvider中数据库是什么时候创建的.经过自己测试,实际上是用户真正插入数据的时候生成的数据库.具体代码见下一篇关于ContentProvider中的数据生成时机的随笔. 现在就说下静态代码块和构造器的执行顺序.实例化一个类A的时候(这里用的是new的方式进行实例化),如果A中有static{},即静态代码块,那么肯定先执行代码块里的代码.然后执行非静态代码块,最后才真正执行构造器里的代码. 实例化一个类A的时候的执行顺

联系人的搜索和添加

学习ContentProvider,例子——电话本 功能: 1.搜索已有联系人 2.添加新的联系人 搜索界面如下: 添加联系人界面如下: Coding: 一.应用授权 1.授予读联系人 <uses-permission android:name="android.permission.READ_CONTACTS"/> 2.授予写联系人 <uses-permission android:name="android.permission.WRITE_CONTAC

Android探索之数据存储Sqlite的介绍及使用

前言: 本来没有打算整理有关Sqlite数据库文章的,最近一直在研究ContentProvider的使用,所有觉得还是先对Sqlite进行一个简单的回顾,也方便研究会学习ContentProvider. Sqlite简介: Sqlite数据库是一种轻量级数据库,它具备跨平台,多语言操作等优点,它广泛用于包括浏览器.IOS,Android以及一些便携需求的小型web应用系统.它具备占用资源低,处理速度快等优点. 接下来具体介绍一下如何 使用? 如何创建一个数据库? public class DBH

Android 学习笔记之ContentProvider实现数据共享....

PS:最近听老师说打算让我参与企业的app制作,让我加快学习的进度...好吧,貌似下周还有考试...貌似实验室这个app也要做...暂时不管了...那就只能加快进度了,感觉略微的有点激动和紧张,总算是可以开始对项目进行着手操作了...学的东西还是很少,还要继续努力啊...搞定Android的网络通信后就可以正式的进入项目开发了...不说废话了... 学习内容: 1.使用ContentProvider存储数据 2.操作联系人的ContentProvider... 3.多媒体信息的ContentPr

【安卓学习笔记1】安卓基本组件Activity,Service,BoradCastReceiver,ContentProvider简介

因为博主以前学习过安卓的一点知识,所以学习笔记和别人不太一样. 博主的学习参考书籍是疯狂android讲义第二版.本系列博客都是记录学习笔记的. 因为博主平时还要上班,所以也就晚上有时间看书,写博客. 博主坚持每天看一个小时的书,记录一下随笔心得. 希望能给大家带来帮助. =========================================================================== 安卓的基本组件 =============================

Android 四大组件学习之ContentProvider二

上节学习了什么是ContentProvider.以及ContentProvider的作用.以及什么是URL.本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider 好.实践是检验真理的唯一标准. 那我们就開始行动吧 第一步: 创建一个自己的ContentProvider,我取名为MyContentProvider public class MyContentProvider extends ContentProvider { @Override public int d

ContentProvider学习例程

ContentProvider总是需要与ContentResolver结合使用,它们之间的关系是: Context提供了getContentResolver()方法,这个表示Activity.Service等组件都可通过getContentResolver()方法获取ContentResolver对象. 获取了ContentResolver对象之后,接下来就可以调用ContentResolver的query().insert().update()和delete()方法 --实际上指定Uri对应的