码迷,mamicode.com
首页 > 其他好文 > 详细

学习 ContentProvider

时间:2015-04-12 00:03:57      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

怎么使用安卓的数据库

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();         // 刷新界面
            }
        }); 

学习 ContentProvider

标签:

原文地址:http://blog.csdn.net/lxcay9/article/details/45000691

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!