`
119568242
  • 浏览: 426931 次
  • 性别: Icon_minigender_1
  • 来自: 深圳/湛江
社区版块
存档分类
最新评论

请您先登录,才能继续操作

android菜鸟日记2 contentProvider

 
阅读更多
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
分享到:
评论

相关推荐

    Android+Room+ContentProvider

    在Android应用开发中,数据持久化是一个至关重要的环节,而Android Room和ContentProvider是其中的两个关键组件。本文将深入探讨这两个技术,并结合实际案例,解释如何在Android应用中使用它们来管理和共享SQLite...

    android 用ContentProvider操作文件

    2. 创建ContentProvider:要创建一个ContentProvider,你需要继承`android.content.ContentProvider`类,并重写其中的关键方法,如`query()`, `insert()`, `update()`, `delete()` 和 `getType()`。 3. 注册...

    Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作

    ContentProvider则是Android框架提供的一种机制,用于在应用程序之间共享数据,同时也可用于管理SQLite数据库。接下来,我们将深入探讨如何使用ContentProvider和SQLite在Android应用中执行数据库操作。 首先,...

    android 数据共享(ContentProvider)

    在Android系统中,数据共享是应用之间相互交互的重要方式,ContentProvider则是官方推荐的实现这一功能的核心组件。ContentProvider提供了一种标准化的机制,使得不同的应用程序可以安全、有序地访问和共享数据,...

    android 数据库 以及自定义ContentProvider demo

    在Android开发中,数据库是应用数据持久化的重要方式,而ContentProvider则是系统提供的一种标准接口,用于不同应用程序之间共享数据。本示例“android 数据库 以及自定义ContentProvider demo”将带你深入理解这两...

    Android实现使用自定义ContentProvider共享生词本数据库

    Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...

    Android ContentProvider简单实现

    2. **定义URI**:ContentProvider通过URI来识别和操作数据。你需要创建一个`UriMatcher`实例,为每种类型的请求分配一个唯一的代码,然后在`match()`方法中使用它来解析传入的URI。 3. **数据存储**:选择合适的...

    Android 之 自定义ContentProvider的使用

    2. **创建ContentProvider** 要创建自定义ContentProvider,首先需要创建一个新的Java类,继承自`android.content.ContentProvider`。在这个类中,需要重写以下几个关键方法: - `onCreate()`: 初始化方法,通常...

    Android第八章ContentProvider

    在Android系统中,ContentProvider是四大组件之一,它是应用程序间数据共享的核心机制。ContentProvider使得一个应用的数据可以被其他应用访问,甚至在不同设备之间进行同步。本章将深入探讨ContentProvider的原理、...

    Android ContentProvider全面解析

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以将自己的数据结构暴露给其他应用,同时也能够访问其他应用公开的数据。本篇文章将全面解析...

    android-关于ContentProvider的使用例子

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享的重要角色。ContentProvider使得应用程序之间能够安全、有序地访问彼此的数据,无论是系统内置的数据(如联系人、日历等)还是自定义的数据存储...

    android 内容提供者 ContentProvider

    在Android系统中,内容提供者(ContentProvider)是四大组件之一,它扮演着数据共享与交换的关键角色。ContentProvider使得应用程序之间可以安全地共享数据,无论是应用内的数据,还是跨应用的数据。它遵循统一的URI...

    android对sqlite、contentprovider的例子

    在Android应用开发中,SQLite和ContentProvider是两个非常重要的组件,它们主要用于数据存储和数据共享。SQLite是一个轻量级的数据库系统,适用于移动设备,而ContentProvider则是一种接口,允许不同应用程序之间...

    Android内容提供者ContentProvider实例

    在Android开发中,内容提供者(ContentProvider)是四大组件之一,它负责在应用程序之间共享数据。本实例将深入解析如何创建和使用一个简单的ContentProvider,同时涉及与数据库的操作。 一、ContentProvider基础 ...

    Android中ContentProvider的示例

    2. **创建ContentProvider子类**: 需要创建一个继承自ContentProvider的类,实现其关键方法,如query(), insert(), update(), delete()和getType()。这些方法对应于对数据的操作。例如,query()方法用于执行查询操作...

    Android四大组件之ContentProvider(二)

    在Android应用开发中,四大组件是Activity、Service、BroadcastReceiver以及我们今天要深入探讨的ContentProvider。ContentProvider作为Android系统中的数据共享机制,允许不同应用之间进行数据交换,它是跨应用数据...

    Android程序技术:ContentProvider.pptx

    Android 程序技术 本节课程内容:ContentProvider Uri(通用资源标识符 Universal Resource ...Android为常见的数据(如通讯录、日程表等)提供了内置了默认的ContentProvider。 ContentProvider类并不会直接与外部进程

    android 创建数据库contentprovider

    在Android系统中,ContentProvider是一种重要的组件,它允许应用程序之间共享数据。`android 创建数据库contentprovider`这个主题主要涉及如何创建一个自定义的ContentProvider来管理数据库中的数据,并实现跨应用的...

    androdi ContentProvider和Uri详解

    在Android开发中,ContentProvider和Uri是两个至关重要的概念,它们是Android系统中不同应用程序间数据共享和交互的基础。本文将深入探讨这两个组件的工作原理、使用方法以及它们在实际开发中的应用。 首先,我们来...

Global site tag (gtag.js) - Google Analytics