2013年7月4日 20:08:47;自定义ContentProvider

额昨天讲课我都不知道我什么心态了,总之从结果来说就是,我学的个什么鸟东西!




0703:


自定义Content provider:
【玩敲:然后这一个MIME类型,他是有打开哪一个应用程序打开的类型,电话,点一个,拨号页面,就说如果你以
后想要把这一个。。业要为他定义相应的类型,在家其他的业差不多,增加关键在于先要cherub个控制,得到,然
后再把剩下的插进去;多媒体操作,他有从外部吃醋卡取得 ,业有从内部,图片,跟我们之前差不多,sd卡,取
得,图片名臣,面熟,图片数据,累名保存的是个路径,还哦大家注意下保存字符窜的时候要length-1,那么得到
路径以后再2用bItmap创建加载图片,之前做的应用,通过列表吧设备上的图片全部加载进来,内存溢出,是因为
图片太大了,几M的数据一次性加到内存中就,,ram,这个手机上边运行的内存是有限的,】
内存溢出报错,再BitMap=xxx之前加代码:
BitMaoFactory.Options opts=new BitMapFactory.Options();//若图片太大会导致内存溢出,使用opts对象来
对图片进行缩放
opts.inSampleSize=5;
Bitmap map = BitmapFactory.decodeFile(new String(bs, 0, bs.length - 1),opts);



手势的操作,对用户的手势操作作一个限制,
-------
自定义Content provider:涉及到一个uri的
原理,作为内容提供者,对数据相应的操作,获取数据ContentResauver内容解析者,
继承ContentProvider,
配置:有属性authorities,


工具类UriMatcher,为了确定该ContentProvider实际能匹配的Uri,以及确定没个够方法中的Uri参数所操作的数


据,
Void addURI(xx);
int match(xx);


工具类ContentUris,操作Uri字符串,两方法,
withAppendeId


【你麻痹做你妈卖批,包空指针又晓不得杂改,叫做新方法下手不了】

监听ContentProvider的数据改变,观察者模式,
下来吧学生管理加上这些,还有添加班级,两级表,有展开,则学生多个班级属性,修改班级是做个弹出框:组件
Spinner(有条目属性entries是数组,也是用adapter);删除可以不删除班级,但是有增加班级功能;2张表还
需有外键联系
烦现在学习状态好糟糕,昨天作业实现新学方法用手势切换图片我都没做,直到晚上为了图完成就是copy别人的,
然后炒好了啥子都没看就那样过去了,老师也不会评讲,真Tm挫,今天也是,绝对的若作业统计没几个差的话,第
二天就不讲了(他是那种头天讲一半,下来喊自己实现,第二天不咋讲的又继续新知识了);然后比如说现在,又
喊实现学生管理系统的ContentProvider来处理,今天是新讲这个知识,他上面演示,下来又不给时间我们好好熟
悉和完善,就叫我们自己开做了,这是教学吗?我就想草了,还不如人家视频上的方法明确,目的明确,条例明确
,自己下来也肯定就会了。。他这样讲都没跟我们讲懂就叫下来自己做,真操蛋。。。我有理由怀疑我这个钱又接
近水漂了,你妹纸的。整天学起这么累,学得还让人伤心,啷个可能学得下去,要学好,休息时间我可以说是绝对
没得的,学你吗的蛋,这不是逼人去耍么。。。
我还恼怒自己吧,看来真记东西理解没得别人轻松了,脑壳问题!
------------
下次课讲多媒体章节


打字骂骂脏话无所谓了,平时咱多乖的~

自定义ContentProvider

要使用 ContentProvider 来操作数据,必须要有保存数据的场所。可以使用文件或 SQLite 数据库的方式来保存数据,通常使用 SQLite 数据库。
为了访问数据,就要提供访问数据的接口。这里需要基础 ContentProvider 类,实现其中访问数据的抽象方法,这些方法有:
query() :查询
insert() :插入
update() :更新
delete() :删除
getType () :获得类型
onCreate () :创建时调用
定义好的 ContentProvider 必须在 AndroidManifest.xml 配置文件中声明才能使用。声明中必须添加的参数是授权属性“ android:authorities
创建 ContentProvider 的步骤说明如下。
1. 创建保存数据库的文件或数据库。
2. 定义一个类继承 ContentProvider ,实现抽象方法。
3. 将定义好的 ContentProvider AndroidManifest.xml 配置文件中声明,以便使用。
为了确定该 ContentProvider 实际能匹配的 Uri ,以及确定每个方法中 Uri 参数所操作的数据, Android 系统提供了 UriMatcher 工具类。 UriMatcher 工具类主要提供了如下两个方法:
void addURI (String authority,String path,int code) :该方法用于向 UriMatcher 对象注册 Uri 。其中 authority path 组合成一个 Uri ,而 code 则代表该 Uri 对应的标识码。
int match(Uri uri ) :根据前面注册的 Uri 来判断指定 Uri 对应的标识码。如果找不到匹配的标识码,该方法将会返回 -1
Android 提供了一个 ContentUris 工具类,它是一个操作 Uri 字符串的工具类,它提供了两个方法。
withAppendedId ( uri,id ) :用于为路径加上 ID 部分。例如:
parseId ( uri ) :用于从指定 Uri 中解析所包含的 ID 值。例如:

Uri uri = Uri.parse("content://com.lovo.providers.studentprovider/data/1");

long dataId = ContentUris.parseId(uri);

//获取的结果为1

之前访问系统 ContentProvider 时,都会把 Uri 、数据列等信息以常量的形式公开出来,方便访问。为此,我们也需要为自定义的 ContentProvider 提供相应的工具类,用以封装这些常量值。比如:
public final class Student {
//定义该ContentProvider的Authority
public static final String AUTHORITY = "com.lovo.providers.studentprovider";
//定义一个静态内部类
public static class Data implements BaseColumns{
//定义Content所允许操作的数据列
public static final String NAME = "s_name";
public static final String AGE = "s_age";
//定义该Content提供服务的Uri
public static final Uri STUDENT_CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/student");
        }
}
//重写insert方法
public Uri insert(Uri uri, ContentValues contentvalues) {
//获得数据库实例
SQLiteDatabase db =  studentDataHelper.getReadableDatabase();
//插入数据,返回行ID
long rowid = db.insert("t_stu", "s_name", contentvalues);
//如果插入成功则返回uri
if(rowid > 0){
//在已有的Uri的后面追加ID数据
Uri stuUri = ContentUris.withAppendedId(uri, rowid);
//通知数据已经改变
getContext().getContentResolver().notifyChange(stuUri, null);
return stuUri;
}
return null;
}

//重写query方法
public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
SQLiteDatabase db = studentDataHelper.getReadableDatabase();
//获取uri的标识码
int matchId = uriMatcher.match(uri);
Cursor cursor = null;
switch (matchId) {
case 1:
//根据uri中的id进行查询
long id = ContentUris.parseId(uri);
String where = "_id="+id;
//如果有条件则组装查询条件的字符串
if(s != null && !s.equals("")){
	where = where + " and " + s;
}
cursor = db.query("t_stu", as, where, as1, null, null, s1);
break;
case 2:
//直接根据条件查询数据
cursor = db.query("t_stu", as, s, as1, null, null, s1);
break;
default:
           throw new IllegalArgumentException("未知的Uri:"+uri);
}
return cursor;
}

监听 ContentProvider 的数据改变
•前面介绍开发ContentProvider时,不管实现insert、delete、update方法中的哪一个,只要该方法导致了ContentProvider里数据的改变,程序就调用了 getContext().getContentResolver().notifyChange(uri, null);
•这行代码可用于通知所有注册在该Uri上的监听者。为了能在应用程序中监听ContentProvider数据的改变,需要利用Android提供的ContentObserver类。
通过继承该类,并重写该类的onChange方法,当ContentProvider的数据发生改变后就会回调onChange方法

为了能监听 ContentProvider 数据的变化,需要通过 ContentResolver 向指定的 uri 注册 ContentObserver 监听器,方法如下: getContentResolver (). registerContentObserver (Uri uri,boolean notifyForDescendents,ContentObserver observer);
该方法有三个参数,参数说明:
uri : 该监听器所监听的 ContentProvider uri
notifyForDescendents :如果参数为 true ,加入注册的监听器的 uri cotent://abc, 那么 uri content://abc/xyz content://abc/foo 的数据发生改变时也会触发该监听器。如果参数为 false ,那么只有 content://abc 会触发。
observer :监听器对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值