android基础03

1.第一次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper会缓存当前的SQLiteDatabase实
例,SQLiteDatabase实例正常情况下会维持数据库的打开状态,所以在你不再需要SQLiteDatabase实例时,请及时调用
close()方法释放资源。一旦SQLiteDatabase实例被缓存,多次调用getWritableDatabase()或getReadableDatabase()
方法得到的都是同一实例。

2.使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction()
方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。

3.SqlLite数据库的主键id,最好为 "_id" ,否则查询的时候得 select id as _id from...

4.使用ContentProvider对外共享数据的好处是统一了数据的访问方式

5.URI代表要操作的数据,由scheme、authorites、path三部分组成
content://cn.itcast.sqlite.provider/person
scheme:固定为content,代表访问内容提供者
authorites:<provider>节点中的authorites属性
path:程序定义的路径,可根据业务逻辑定义

6.UriMatcher类用于匹配Uri,它的用法如下:
UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH); 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码,值为 -1
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1); 添加(注册)需要匹配uri,如果匹配就会返回匹配码 1

sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2); #号为通配符,如果match()方法匹配.../person/230路径,返回匹配码为2
switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) {
   case 1
break;
   case 2
break;
   default: 不匹配
break;
}

7.ContentUris类用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
withAppendedId(uri, id)用于为路径加上ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10);
生成后的Uri为:content://cn.itcast.provider.personprovider/person/10

parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);//获取的结果为:10

8.当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要
获取ContentResolver对象,可以使用Activity提供的getContentResolver()方法。

9.内容提供者的使用流程

1.如果a应用想把自己的数据库暴露给别的应用程序使用
就必须实现contentprovider
创建一个类 继承系统的ContentProvider
一定要在清单文件里面配置
指定uri的主机名 cn.itcast.db.personprovider

2. 定义匹配规则
根据数据库的表结构 定义匹配规则
content://cn.itcast.db.provider/persons
content://cn.itcast.db.provider/person/10

也可以根据业务方法, 指定匹配规则
content://cn.itcast.db.provider/delete/10

3.在别的应用里面 获取contentResolver

contentResolver.query()
   .delete()
   .insert();

10.如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头

11. BaseAdapter
调用getItemAtPosition方法可以获取点击的条目上的对象
BaseAdapter会返回自定义的getItem方法中返回的对象

12.ContentProvider
1.ContentProvider的作用
用来将当前应用中的数据进行共享, 提供增删改查方法对数据进行包装, 在ContentProvider上可以添加ContentObserver, 用来监听数据变化
2.创建ContentProvider
定义类继承ContentProvider, 重写6个抽象方法
在清单文件中的<application>节点下, 声明<provider>节点, 指定类名和主机名(provider的唯一标识)
3.调用ContentProvider
使用当前应用的上下文对象, 调用getContentResolver()获得一个解析器, 然后就可以调用解析器的增删改查方法了
4.增删改查方法
用UriMatcher来判断传入的Uri
使用SQLiteDatabase类的insert, delete, update, query等方法操作数据库, 将调用Provider时传入的参数传入到数据库中
5.ContentObserver
可以给一个ContentProvider注册一个观察者
调用ContentResolver的registerContentObserver方法, 在指定的Uri上注册一个Observer
Observer是自定义一个类继承ContentObserver, 重写onChange方法
如果Provider中调用了notifyChange方法, 那么Observer就会执行onChange方法

13.ContentResolver的方法返回值:
1.insert方法返回的是 Uri
2.update和delete方法返回的是 int
3.query方法返回的是 Cursor

14.监听短信
1.短信数据都存储在com.android.providers.telephony项目的数据库中
2.从 https://github.com/android 网站上可以下载到源代码, 查看清单文件, 可以得知这个数据库有提供provider, 而provider的authorities为sms
3.在这个provider上注册一个Observer, 如果数据改变, 就使用Provider查询数据库

猜你喜欢

转载自xpchou.iteye.com/blog/1629292