Android菜鸟日记2
contentProvider
contentProvider的概念:
contentProvider是一种资源包装器。充当抽象列集和数据库中真实的列集之间的媒介。
Android MIME类型的结构(通过getType()获得)
MIME标准结构
父类型/子类型
如果是供应商具有的专用数据格式的话,则为Vnd开头
Ex:Micorsoft excel电子表格 使用子类型vnd.ms-excel标识
一些子类以X开头 这些子类是不必注册的非标准子类型。他们被视为两个协作机构共同定义的私有类型。
Android MIME类型
Android标示这些类型和子类具有非标准的,供应商特定的前缀。
每个内容型的Android MIME类型都具有两种形式:
一种用于单条记录,一种用于多条记录。
单条记录类似于
Vnd.android.cursor.item/vnd.yourcompanyname.contenttype
多条记录类似于
Vnd.android.cursor.dir/vnd.yourcompanyname.contenttype
使用Android MIME的三点注意
1. 类型和子类型对于他们所要标示的内容必须是唯一的。
2. 如果类型和子类型不是标准的则需要在他们前面添加vnd。
3. 他们通常针对具体的需求添加命名空间。
Android内容URI的结构
Content://授权/*/*
Ex:content://authority-name/path-segment1/path-segment2/ect
授权:用于在提供程序的注册表中定位contentProvider。
/notes/23
为每个contentProvider的路径部分2个*称为路径片段。
且 第一部分指向一个对象集合。Ex:/notes表示一个笔记集合或目录
第二部分标示特定的笔记 ex:/23表示特定的笔记
使用:
插入记录:
1. 创建一个contentvalue 对象x
2. 对x赋值(x.put(键,值))
3. 创建一个contentResolver对象c [内容解析器]
4. C.insert(uri, contentvalue) 此方法返回新插入的url地址(方法中的uri为到表的uri)
contentProvider的增删改查
注:对内容的增删改查 是要通过activty获得contentResolver对象,用contentResolver对象执行的。
增contentResolver.insert(uri, contentvalue)
删contentResolver.delect(
Uri uri, /只需到表的uri 行由下面2个决定
String whereClause, /where 字段 ex: id=?
String selction[], /?的内容 ex:23
)
改contentResolver.update(
Uri uri, /只需到表的uri 行由最后2个决定(whereClause, selction[],)
ContentValue value /内容值 是键值对的集合 即放入需更改位置的新值
String whereClause, /where 字段 ex: id=?
String selction[], /?的内容 ex:23
)
查
查是通过contentResolver对象.openOutputStream(url)取得。
描述:contentResolver对象 打开一个输出流对象存放url的内容。
UriMatcher
描述:这是一个URI解析器
工作原理:告诉UriMatcher 实例需要什么样式的URI,然后将唯一编号与这些模式绑定,注册。
注册:
Static{
UriMatcher xxx= new UriMatcher();
xxx.addURI(BookProviderMetaData.AUTHORITY,”books”,asdasdasd)
//(授权,uri尾,唯一编号)
//注册
//授权在BookProviderMetaData定义 [数据库元数据定义类]
}
注册后就可以调用UriMatcher 实例验证uri是否在注册中了
UriMatcher.match(uri)//通过uri找匹配的唯一编号
投影映射概念
概念:contentProvider充当抽象列集和数据库中真实的列集之间的媒介,这些列集可能是不同的。可以借助SQLiteQueryBuilder类来就建立此投影映射。
投影映射将调用方法传入的的查询中的列名称映射到数据库列名称。如果设置投影映射,他必须包含所有可能请求的所有列名称,即使这些列的键,值相同。
方法传入 name ?映射到people.name
Ex: sBooksProjectionMap = new HashMap<String,String>();
sBooksProjectionMap.put(方法传入的列名称,映射的数据库列名称)
注册contentProvider[提供程序]
<provider android:name="NotePadProvider"
android:authorities="com.google.provider.NotePad"
/>
描述:
<provider android:name="对应类(在<manifest package
>指定下的类)"
android:authorities="授权"
/>
android:authorities="com.google.provider.NotePad"为对类NotePadProvider的授权定义
只有再Android描述文件中注册的provider才能被使用。可以理解为这段com.google.provider.NotePad对应着NotePadProvider类
授权的概念是:唯一标示字符串,用于分辨内容提供程序[contentProvider]
实现一个ContentProvider
首先实现一个ContentProvider步骤:
1. 计划数据库、url、列名称等,创建元数据类(是另一个类,非ContentProvider扩展类。来定义无所有这些数据元素的常量MIME 列名 创建日期 修改日期等)。
2. 扩展抽象方法ContentProvider。
3. 实现方法query、insert、update、delete、getType
4. 在androidmainifest中注册程序。
getType方法
描述实现ContentProvider的getType()方法
Public string getType(Uri uri)
{
Blablalba……
}
传入uri
然后用sUriMatcher(uri)验证uri
Case入相应的return.(uri到表还是到行)
Query方法
描述:实现ContentProvider的Query ()方法
查询为read操作 需要使用到SQLiteQueryBuilder对象来操作
如果是增删改就不需要此对象字节用SQLiteDatbase 对象相应的操作即可
整体过程为:
1. 实例化SQLiteQueryBuilder对象
2. 对传入的uri通过sUriMatcher分析
2.1若为到表uri则SQLiteQueryBuilder对象setTable()//表 setProjectionMap()//列投影(这个表有什么列)
2.2若为到行uri则SQLiteQueryBuilder对象setTable()//表 setProjectionMap()//列投影(这个表有什么列)appendWhere(BookTableMetaData._ID+”=”+uri.getPathSegments().get(1))
3.验证传入的 sortOrder. 若无则传入默认,若有则赋值为传入的。
4.获得数据库读操作对象。
SQLiteDatabase db =MopernHelper.getReadableDataabase();
5. 调用SQLiteQueryBuilder对象 处理操作
Cursor c=SQLiteQueryBuilder对象.query(db,projection,selection,selectionArgs,null,null,orderBy)
Cursor c 返回(类result) \ db数据库读操作对象 \projection 需要返回的列 \selection where字段 \selectionArgs where字段的值
Insert方法
描述:实现ContentProvider的Insert ()方法将记录插入到基础数据库中,然后返回指向新创建的URI
由于insert为写操作 直接用SQLiteDatbase对象即可。
整体过程为:
1. 对传入的uri通过sUriMatcher分析
1.1若非到表uri则则丢出异常(插入操作uri只能到表不能到行)
2.验证传入的values完整性,不完整则补充之(列,创建时间,last修改时间,主键必须有)。
3.获得写操作对象:
SQLiteDatabase db = mOpernHelper.getWritableDataabase();
3. 调用写操作对象的insert方法插入数据库 此方法返回一个插入出的rowid。
long rowID=Db.insert(表名,主键名,values);
4. 代码使用rowid构造新的uri.
Uri xx = ContentUris.withAppendedID(BookTableMetaData.CONTENT_URI,rowID)
Update方法
描述:实现ContentProvider的Update ()方法 将记录修改一行或者多行数据放回修改的的记录数量。
完整过程:
1. 通过mOpernHelper获得写操作对象
SQLiteDatabase db = mOpernHelper.getWritableDataabase();
2. 对传入的uri通过sUriMatcher分析
1.1若传入到表则执行db.update(tableNAME,valuse,where,whereArgs)
1.2若传入到行则执行db.update(tableNAME,valuse,X写在下面 whereArgs)
// rowid为rowid=uri.getPathSegments().get(1)获取的
X 的内容为:
BookTableMetaData._ID+”=”+rowID+(!TextUtils.isEmpty(where)?”AND(“+where+’)’:””)
意思为表中id=传入uri中id ,where字段不为空则where为空则“”即无。
delete方法
描述:实现ContentProvider的delete ()方法 将记录删除一行或者多行数据放回修改的的记录数量。整体方法与updata十分相似
完整过程:
1.通过mOpernHelper获得写操作对象
SQLiteDatabase db = mOpernHelper.getWritableDataabase();
2. 对传入的uri通过sUriMatcher分析
1.1若传入到表则执行db. delete (tableNAME,valuse,where,whereArgs)
1.2若传入到行则执行db. delete (tableNAME,valuse,X写在下面 whereArgs)
// rowid为rowid=uri.getPathSegments().get(1)获取的
X 的内容为:
BookTableMetaData._ID+”=”+rowID+(!TextUtils.isEmpty(where)?”AND(“+where+’)’:””)
意思为表中id=传入uri中id ,where字段不为空则where为空则“”即无。
//x?a:b
X true则a false 则 b
2011-6-30
poolo