赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android系统的数据存储与访问
Android系统的数据存储与访问

程序可被理解为数据输入、输出以及数据处理的过程,程序执行中通常需读取处理数据并且将处理结果存放起来。在开发过程中,可以根据程序的实际需要选择合适的存取方式。

1.SharedPreferences:

当仅需要少量数据需要保存,且数据结构比较简单时,可以将这些数据保存于本地文件。Android提供了SharedPreferences用于存储数据。
1)SharedPreferences及其方法:
SharedPreferences以键值Key-Value的形式存放在XML文件中,开发人员无需关注如何操作文件,只需要了解SharedPreferences中的操作函数,利用相关读写即可实现对数据的读写。
SharedPreferences常用的方法为:

方法

描述

contains(String key)

判断是否包含一个该键值

edit()

返回SharedPreferencesEditor对象

getAll()

取得所有值Map

getBoolean(String key,boolean defValue)

获取一个布尔值

getFloat(String key,float defValue)

获取一个float

getInt(String key,int defValue)

获取一个int值

getString(String key,String defValue)

获取一个String值

getLong(String key,long defValue)

获取一个long值

registerOnSharedPreferenceChangeListener()

注册preference发生变化的监听函数

unregisterOnSharedPreferenceChangeListener()

注销一个之前注册的监听函数

SharedPreferences.Editor编辑器提供保存数据的方法:

方法

描述

clear()

清除所有值

commit()

保存

getAll()

返回所有值Map

putBoolean(String key,boolean value)

保存一个布尔值

putFloat(String key,float value)

保存一个float值

putInt(String key,int value)

保存一个int值

putString(String key,String value)

保存一个String值

putLong(String key,long value)

保存一个long值

remove(String key)

删除key所对应的值

从SharedPreferences及其Editor提供的方法可以看到,SharedPreferences只支持简单数据类型的存储操作。
2)SharedPreferences存储数据的步骤为:
⑴调用Context提供的getSharedPreferences()方法来获取SharedPreferences实例:
getSharedPreferences()方法涉及两个参数,name为要访问的文件,由于SharedPreferences文件存储的路径是唯一的,此处只需要文件名。如果为写入操作,而系统并没有name文件,会自动创建一个名为name的文件。参数mode表示访问权限,支持的值有MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE,分别表示只能被本应用程序读/写、能被其他应用程序读、能被其他应用程序读/写。
⑵使用SharedPreferences.Editor的putXxx()方法保存数据:
SharedPreferences是通过调用edit()方法来获取对应的Editor对象,由Editor对象实现对数据的写入。Editor对象提供的写入数据方法有:
·Editor clear():清空所有数据
·Editor putXxx(String key,Xxx value):存入指定key对应的数据value
·Editor remove(String key):删除该key指向的数据项
·boolean commit():当Editor完成编辑后,提交修改
⑶使用SharedPreferences.Editor的commit()方法将本次操作的数据写到XML文件中。
⑷使用SharedPreferences.Editor的putXxx()方法获取相关数据:
提供了以下几个方法来读取数据:
·boolean contains(String key):判断是否包含key指向的数据
·abstract Map<String,?> getAll():获取所有SharedPreferences数据,返回值为一个Key-Value形式描述的Map对象
·boolean getXxx(String key,Xxx defVal):获取key所指向的value值,若key不存在,则返回默认值defVal,Xxx表示数据类型
示例:
Editor editor=mySharedPreferences.edit();
editor.putString("name","android");
editor.commit();
3)读写其他应用程序的SharedPreferences:
要访问其他应用程序的SharedPreferences数据,需要先获取应用程序的访问权限。步骤为:
⑴创建其他应用程序的Context:
Context context=createPackageContext("包名",Context.CONTEXT_IGNORE_SECURITY);
createPackageContext()方法为应用程序创建了对应的context,该方法第一个参数是该应用程序的包名,第二个参数表示忽略安全警告。
⑵调用Context提供的getSharedPreferences()获取SharedPreferences实例:
SharedPreferences mySharedPreferences=context.getSharedPreferences(name,mode);
其中的mode取值为MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE。
⑶读写数据:
对其他应用程序的SharedPreferences数据的读写与读写应用程序自身的SharedPreferences数据一样。
4)SharedPreferences数据文件:
SharedPreferences数据文件的存储路径是唯一的,以XML文件的形式保存于/data/data/<应用程序包名>/shared_prefs目录下。代码为:
<map>
<string name="id" value="001"/>
<string name="name" value="张三"/>
<int name="age" value="20"/>
</map>
代码中,<map>节点是SharedPreferences数据文件的根元素,该元素的每个子元素表示一组Kay-Value数据;<int>节点表示value是一个整型值;<string>节点表示value是一个字符串。

2.文件存储:

文件存储方式不受类型限制,可以将一些数据直接以文件形式保存在设备中,如文本文件、PDF、音频、图片等。如果需要存储复杂数据,可以使用文件进行存储,Java提供了一套文件I/O工作机制实现对文件的操作管理,Android借助Java的文件管理体系实现对手机系统的文件操作。
1)文件打开函数:
Android系统利用openFileInput(name)和openFileOutput(name,mode)两个函数来获取文件流,前一个负责打开应用程序下的文件的输入流,后一个负责打开文件的输出流,其中的参数name为文件名,参数mode为打开模式,支持MODE_PRIVATE、MODE_APPEND、MODE _WORLD_READABLE、MODE_WORLD_WRITEABLE,其中MODE_APPEND为以追加方式打开文件,写入信息拼接在文件尾部。
2)读写SD卡上的文件:
为了更好地利用手机存储空间,通常将一部分数据文件存放在外部存储设备上,如SD卡。对SD卡上的文件进行操作步骤为:
⑴获取SD卡的访问权限:
为了能够读写外部存储器上的文件,要获取读写许可。在AndroidManifest.xml文件中需要添加读/写SD卡的访问权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
⑵检查SD卡是否可用:
调用Environment的getExternalStorageState()方法来判断SD卡是否可用,以及确保应用程序具有对SD卡的读写权限:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
此方法返回外部存储器的当前状态,MEDIA_MOUNTED表示外部存储器已插入并可以进行读写访问。
⑶获取SD卡路径:
调用Environment的getExternalStorageDirectory()方法获取SD卡的路径。
⑷操作SD卡中的文件:
借助Java的I/O体系实现对SD卡文件的操作。

3.SQLite数据库:

SQLite为Android系统内置的一款轻量级开源嵌入式数据库,最大支持2048G数据,占用不到1M的内存空间就可运行,因此广泛应用在小型嵌入式设备中。SQLite数据库功能强大,提供了基本数据库、表以及记录的操作,包括数据库创建、数据库删除、表创建、表删除、记录插入、记录删除、记录更新、记录查询等操作,并支持事务处理。
1)手动创建SQLite数据库:
⑴进入adb shell:
adb工具在Android SDK的platform-tools目录下,使用cmd命令行界面,进入该目录,输入命令adb shell,出现root提示符#。通常SQLite数据库文件存放在data/data/ "packagename"/databases目录下,使用命令:cd data/data/cn.example.dwenzhao.sqlite/databases进入目录。
⑵创建数据库:
Android SDK的platform-tools目录下提供了管理SQLite数据库工具sqlite3.exe,输入“sqlite3 filename”命令可以打开数据库,如果文件不存在就自动创建新文件。示例:
#sqlite3 myData.db3
显示“sqlite>”提示符。
⑶创建数据库表格:
利用create table命令可以创建数据表格,sqlite3工具遵循SQL语法,同样支持insert、update、delete、select等命令。示例:
create table user<_id integer primary key,userno varchar,name varchar,sex varchar>;
insert into user values <1,'001','Lily',"female'>;
创建数据库后,可以在Eclipse的File Explorer面板发现创建的数据库文件myData.db3。
⑷sqlite3常用命令:
除了常用的SQL命令外,还可以使用.databases、.tables、.help等命令,用来查看当前数据库、数据表、支持的命令。
2)SQLiteDatabase:
Android提供了创建和使用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法:

方法

描述

openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)

打开或创建数据库

openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags)

打开指定的数据库

close()

关闭数据库

insert(String table,String nullColumnHack,ContentValues values)

插入一条记录

delete(String table,String whereClause,String[] whereArgs)

删除一条记录

query(boolean distinct,String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy, String limit)

查询记录

update(String table,ContentValues value,String whereClause,String[] whereArgs)

修改记录

execSQL(String sql)

执行一条SQL语句

⑴打开/创建SQLite数据库:
openDatabase()方法用于打开指定的数据库,该方法有3个参数,其中path用于指定数据库的路径,若指定的数据库不存在,则抛出FileNotFoundException异常;factory用于构造查询时的游标,若factory为null,使用默认构造游标;flags指定数据库打开模式,定义了4种打开模式:

OPEN_READONLY

以只读方式打开数据库

OPEN_READWRITE

以可读写方式打开数据库

CREATE_IF_NECESSARY

检查数据库是否存在,若不存在则创建数据库

NO_LOCALIZED_COLLATORS

打开数据库时,不按照本地化语言对数据进行排序

数据库打开模式可以同时指定多个,中间使用“|”进行分隔。
使用openOrCreateDatabase()创建打开数据库时,作用如同openDatabase(path,factory, CREATE_IF_NECCSSARY)一样。因为创建SQLite数据库也就是在文件系统中创建一个SQLite数据库文件,所以应用程序必须对创建数据库的目录有可写权限,否则会抛出SQLiteException异常。示例代码:
SQLiteDatabase sqliteDatabase = SQLiteDatabase.openDatabase("student.db", null, NO_LOCALIZED_COLLATORS);
SQLiteDatabase sqliteDatabase = SQLiteDatabase.openOrCreateDatabase("student.db", null, );
⑵删除数据库:
android.content.Context.deleteDatabse()方法用于删除指定的数据库:
deleteDatabase("student.db");
⑶关闭数据库:
sqliteDatabase.close();
3)表操作:
⑴创建表:
数据库包含多个表,每个表可存储多条记录。数据库创建后,下一步需要创建表。SQLite没有提供专门的方法创建表,可通过execSQL()方法并指定SQL语句来创建表:
String SQL_CT="CREATE TABLE student (id INTEGER PRIMARY KEY,"+"age INTEGER, name TEXT)";
sqliteDatabase.execSQL(SQL_CT);
⑵删除表:
通过execSQL()方法并指定SQL语句删除表:
String SQL_DROP_TABLE="DROP TABLE student");
sqliteDatabase.execSQL(SQL_DROP_TABLE);
4)记录操作:
⑴插入记录:
向表中插入记录有两种实现方法:insert()和execSQL()方法
◆insert()方法:
可使用SQLiteDatabase的insert()方法向SQLite数据库的表中插入数据:
insert(String table,String nullColumnHack,ContentValues values)
其中,参数table为要插入数据的表名;nullColumnHack是空列的默认值;values是一个封装了列名和列值的Map,代表一条记录信息,为android.content.ContentValues类型的对象。
ContentValues contentValues=new ContentValues();
contentValues.put("id",1);
contentValues.put("age",26);
contentValues.put("name","StudentA");
sqliteDatabase.insert("student",null,contentValues);
◆execSQL()方法:
使用execSQL()方法向数据库中插入数据时,需要先编写插入数据的SQL语句,然后再执行execSQL()方法:
String SQL_INSERT="INSERT INTO student(id,age,name)"+"values(1,26,'StudentA')";
sqliteDatabase.execSQL(SQL_INSERT);
⑵更新记录:
更新记录也有两种实现方式。
◆update()方法:
可使用SQLiteDatabase的update()方法对数据库表中的数据进行更新:
update(String table,ContentValues value,String whereClause,String[] whereArgs)
其中,参数table是要更新数据的表名;value是更新的记录信息ContentValues对象;whereClause是更新条件;whereArgs)是更新条件值数组。示例代码:
ContentValues contentValues=new ContentValues();
contentValues.put("id",1);
contentValues.put("age",25);
contentValues.put("name","StudentA");
sqliteDatabase.insert("student",contentValues,"name=StudentA",null);
◆execSQL()方法:
使用execSQL()方法更新数据库时,需要先编写更新数据的SQL语句,然后再执行execSQL()方法:
String SQL_UPDATE="UPDATE student SET age=25 where='studentA'";
sqliteDatabase.execSQL(SQL_UPDATE);
⑶查询记录:
使用SQLiteDatabase的query()方法查询记录,包括提供的6个方法,常用的方法为:
public Cursor query(boolean distinct,String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
其中,参数distinct是可选布尔值,用来区分返回的记录是否只包含唯一的值;table为表名;columns为列名数组;selection为条件子句,可以包含通配符“?”,可被参数数组中的值替换;selectionArgs为参数数组,替换where子句中的“?”;groupBy为分组列;having为分组条件;orderBy为排序列;limit用来定义返回的行数,即分页查询限制,是一个可选字符串。
query()方法的返回值是一个Cursor游标对象,相当于结果集ResultSet。游标提供了一种对从表中检索出的数据进行操作的灵活手段,实际上是一种能从多条记录的结果集中每次提取一条记录的机制。游标总是与一条SQL选择语句相关联,因为游标由结果集和结果集中指向特定记录的游标位置组成。当对结果集进行处理时,必须声明一个指向该结果集的游标。Cursor游标常用方法有:

方法

描述

move(int offset)

以当前的位置为基准,将Cursor移动到偏移量为offset的位置。offset为正值向前移动;负值,向后移动。

moveToPosition(int position)

将Cursor移动到绝对位置position。

moveToNext()

将Cursor向前移动一个位置,等同于move(1)。

moveToLast()

将Cursor移动到最后一条记录,等同于moveToPosition(count)。

moveToFirst()

将Cursor移动到第1条记录,等同于moveToPosition(1)。

isBeforeFirst()

判断Cursor是否指向第1项数据之前

isAfterLast()

判断Cursor是否指向最后1项数据之后

isClosed()

判断Cursor是否关闭

isFirst()

判断Cursor是否指向第1项记录

isLast()

判断Cursor是否指向最后一条记录

isNull(int columnIndex)

判断指定的位置ColumnIndex的记录是否存在

getCount()

获取当前表的行数,即记录总数

getInt(int columnIndex)

获取指定列索引的int类型值

getString(int solumnIndex)

获取指定列索引的String类型值

示例:
Cursor cursor=sqliteDatabase.query(true,"student",null,"name=StudentA",null,null,null,null,null);
if(cursor.moveToFirst()){
int id=cursor.getInt(0);
int age-cursor.getInt(1);
String name=cursor.getString(3);
System.out.println(id+":"+age+":"+name);
}
⑷删除记录:
删除记录也有2种实现方式。
◆delete()方法:
可使用SQLiteDatabase的delete()方法删除数据库表中的数据:
delete(String table,String whereClause,String[] whereArgs)
其中,参数table是表名;whereClause是删除条件;whereArgs)是删除条件的参数数组。示例代码:
sqliteDatabase.delete("student","name=?",new String[]{"studentA"});
◆execSQL()方法:
使用execSQL()方法删除表数据时,需要先编写删除的SQL语句,然后再执行execSQL()方法:
String SQL_DELETE="DELETE FROM student where name='studentA'";
sqliteDatabase.execSQL(SQL_DELETE);
5)SQLiteOpenHelper:
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新。
SQLiteOpenHelper的构造方法为:
SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory,int version)
常用的方法有:

方法

描述

onCreate(SQLiteDatabase db)

创建数据库时调用

onUpdate(SQLiteDatabase db,int oldVersion,int newVersion)

版本更新时调用

getReadableDatabase()

创建或打开一个只读数据库

geWritableDatabase()

创建或打开一个读写数据库

其中提供了两种打开/创建方式:
·public SQLiteDatabase getReadableDatabase():创建或打开数据库
·public SQLiteDatabase getWritableDatabase():以读写方式创建或打开数据库
通常情况下,两种方法实现的效果是一样的,但当磁盘出现诸如内存不够等现象导致无法写入时,调用getWritableDatabase实现打开数据库就会出错,而调用getReadableDatabase在Write失败的情况下将以只读方式打开。示例:
DemoOpenHelper dbhelper=new DemoOpenHelper(DemoActivity.this,"demo.db3",1);
SQLiteDatabase sb=dbhelper.getReadableDatabase();
关闭数据库调用close()方法,如:
dbhelper.close();
Android利用SQLiteOpenHelper类来管理数据表创建和版本更新。示例:
public class DemoOpenHelper extends SQLiteOpenHelper{
public DemoOpenHelper(Context context,String name,int version){
super(context,name,null,version);
}
@Override
public void onCreate(SQLiteDatabase db){
//创建数据库表
}
@Override
public void onUpgrade(SQLiteDatabase arg0,int arg1,int arg2){
//版本升级时维护数据库表
}
}
代码中定义了一个继承SQLiteOpenHelper的类,并实现该类的onCreate方法和onUpgrade方法,该类的构造函数用来初始化数据库连接。当数据库第一次被创建时onCreate方法被触发,在该方法中可以实现数据表的创建;当数据库需要升级时,onUpgrade方法被触发,用以实现数据库更新,例如数据表修改或删除等。

4.ContentProvider:

通常Android应用程序之间的数据不能直接访问,为了实现不同应用程序之间的数据交互,提供了ContentProvider接口,即把一个应用程序自己的数据提供ContentProvider暴露给其他应用程序,而其他应用程序提供ContentProvider来获取暴露的数据。应用程序之间交互的数据,可以是数据库中的数据,也可以是文件系统中的数据,还可以是网络数据。
1)ContentProvider的使用:
ContentProvider定义在android.content包下面,通过这个组件可访问Android提供的应用数据,如联系人列表。Android系统为一些常见的应用,如音乐、视频、图像、联系人列表等,定义了相应的ContentProvider,它们被定义在android.provider包下。但需要在配置文件AndroidManifest.xml中添加许可,才能访问ContentProvider中的数据。
ContentProvider常用的方法为:

方法

描述

insert(Uri,ContentValues)

插入数据

delete(Uri,String,String[])

删除数据

update(Uri,ContentValues,String,String[])

更新数据

query(Uri,String[],String,String[],String)

查询数据

getType(Uri)

获得MIME数据类型

onCreate()

创建ContentProvider时调用

getContext()

获得Context对象

定义一个ContentProvider,必须实现insert()、delete()、update()、query()、getType()这几个操作数据的抽象方法。
ContentProvider将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,而每一列为具有特定数据类型和意义的字段,每一条数据记录都包含一个“_ID”数据列,该字段唯一标识一个记录。
2)URI:
URI为提供者与调用者交互的桥梁,可以分为4个组成部分,语法结构:
content://<authority>/<words>/<id>;
其中,content://为通用前缀,表示该URI用于ContentProvider定位资源;<authority>为授权者名称,系统由这个部分来查找待操作的ContentProvider;<words>为资源部分,当访问者需要访问不同资源时,这个部分是可以动态改变的;<id>为数据编号,用来唯一确定数据集中的一条记录,用来匹配数据集中_ID字段的值,这个部分是可以省略的。
通常对于利用字符串来定义URI的情形,如“content://cn.example.dwenzhao.contentprovider /data”,为了将字符串转化为URI,可以调用URI工具类parse()方法进行转换。示例:
Uri uri=Uri.parse("content://cn.example.dwenzhao.contentprovider/data");
URI后面可以加上记录的ID值,Android提供了2种方法用于在URI后扩展记录ID:
⑴withAppendedId():
该方法是ContentUris类的方法。示例:
Uri uri=Uri.parse("content://qdu.edu/student");
Uri resultUri=ContentUris.withAppendedId(uri,3);
ContentUris类还提供了parseId()方法用于从路径中获取ID部分:
Uri uri=Uri.parse("content://qdu.edu/student/3");
long personid=ContentUris.parseId(uri);
⑵withAppendedPath():
该方法是Uri的方法。通过该方法可以简单地在URI后扩展一个ID。示例:
Uri uri=Uri.withAppendedPath(Contacts.CONTENT_URI,41);
上述代码是要在联系人数据库中查找记录41。
几乎所有的ContentProvider的操作都会用到URI,因此通常将URI定义为常量,示例中的
android.provider.Contacts.CONTENT_URI就是联系人列表的CONTENT_URI常量。
3)ContentResolver:
应用程序不能直接访问ContentProvider中的数据,可通过Android系统提供的容器解析器ContentResolver来间接访问。ContentResolver提供了对ContentProvider数据进行查询、插入、修改、删除等操作的方法。通通常ContentProvider是单实例的,但可以有多个ContentResolver在不同的应用程序和不同进程之间与ContentProvider进行交互。
每个应用程序的上下文都有一个ContentResolver实例,可以使用getContentResolver()方法获取该实例对象:
ContentResolver cr=getContentResolver();
⑴查询:
使用ContentResolver的query()方法查询数据与SQLite查询一样,返回一个指向结果集的游标Cursor:
ContentResolver resolver=getContentResolver();
Cursor cursor=resolver.query(Contacts.CONTENT_URI,null,null,null,null);
还可以使用Activity的managedQuery()方法查询ContentProvider中的数据,第1个参数也是ContentProvider的CONTENT_URI常量,用来标识某个特定的ContentProvider和数据集,返回也是一个Cursor对象,而且Activity还可以管理Cursor的生命周期。
⑵插入:
使用ContentResolver的insert()方法向ContentProvider中增加一个新纪录时,需要先将新纪录的数据封装到ContentValues对象中。insert()方法返回一个URI,内容是由ContentProvider的URI加上该新纪录的扩展ID得到的,可以通过该ID对该记录做进一步操作。示例:
ContentValues contentValues=new ContentValues();
contentValues.put(Contacts._ID,1);
contentValues.put(Contacts.DISPLAY_NAME,"zhangsan");
ContentResolver resolver=getContentResolver();
Uri uri=resolver.insert(Contacts.CONTENT_URI,contentValues);
⑶删除:
如果要删除单个记录,可以调用ContentResolver.delete()方法,通过该方法传递一个特定行的URI参数来实现删除操作。如果要对多行记录执行删除操作,就需要给delete()方法传递需要被删除的记录类型的URI以及一个where子句实现多行删除:
ContentResolver resolver=getContentResolver();
resolver.delete(Uri.withAppendedPath(Contacts.CONTENT_URI,41),null,null);
resolver.delete(Contacts.CONTENT_URI,"_id<5",null);
⑷更新:
使用ContentResolver.update()方法实现记录的更新操作。示例:
ContentValues contentValues=new ContentValues();
contentValues.put(Contacts.DISPLAY_NAME,"zhangsan");
ContentResolver resolver=getContentResolver();
resolver.update(Contacts.CONTENT_URI,contentValues,"_id=5",null);
4)创建数据提供者:
Android系统通过继承ContentProvider类创建一个数据提供者,创建步骤分为三步:
①创建一个继承ContentProvider的类,重载类的6个函数:
·public boolean onCreate():用于初始化底层数据集和建立数据连接等。当其他程序第一次访问ContentProvider时,该ContentProvider会被创建出来,并调用该方法
·public int delete(Uri uri,String selection,String[] selectionArgs):根据Uri删除selection条件所匹配的数据集。
·public Uri insert(Uri uri,ContentValues values):根据Uri添加数据集
·public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):根据Uri查询符合selection条件的数据集
·public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs):根据Uri更新符合selection条件的数据集
·public String getType(Uri uri):返回指定URI的MIME数据类型
②声明CONTENT_URI,实现UriMatcher:
Android系统提供了UriMatcher工具类,提供两种方法:
·void addUri(String authority,String path,int code):用于向UriMatcher对象注册Uri,其中的authority和path组成一个Uri,而code代表该Uri对应的标识码。示例:
UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
matcher.addUri("cn.example.dwenzhao.contentprovider","data",1);
·int match(Uri uri):根据注册的Uri匹配获取对应的标识码,如果匹配不到,则返回-1。
如:matcher.match(Uri.parse("content://cn.example.dwenzhao.contentprovider/data/1"));
除此之外,Android还提供了一个ContentUris工具类,用于操作Uri字符串的工具类,它提供如下两个方法:
·withAppendedId(uri,id):用于为路径加上ID部分,示例:
Uri uri=Uri.parse("content://cn.example.dwenzhao.contentprovider/data");
Uri newUri=ContentUris.withAppendedId(uri,1);
·parseId(uri):用于从指定的Uri中解析出所包含的ID值。
Uri uri=Uri.parse("content://cn.example.dwenzhao.contentprovider/data/1");
long dataUri=ContentUris.parseId(uri);
③注册ContentProvider:
应用程序必须在配置文件AndroidManifest.xml中注册ContentProvider,才能使用。注册需要在<application/>元素下添加<provider/>子元素即可,代码为:
<provider android:name=".DataProvider"
android:authorities="cn.example.dwenzhao.contentprovider" android:exported="true"/>
5)使用数据提供者:
当一个程序使用ContentProvider暴露数据之后,其他应用程序即可通过ContentProvider对象共享这些数据。ContentProvider通过URI来查询ContentProvider中提供的数据。程序开发者只需知道Uri与数据集的数据格式即可对数据进行操作。获取共享数据的操作步骤为:
⑴获取ContentResolver对象:
调用getContentResolver()方法获取ContentResolver对象。
ContentResolver resolver=getContentResolver();
⑵操作数据:
与ContentProvider类中数据操作(增、删、改、查)方法对应,ContentProvider对象也有4个方法,分别为:insert()、delete()、update()、query(),这4个方法的参数列表与ContentProvider中对应的方法一致。调用任意一个方法即可触发Uri对应的ContentProvider中的方法。示例:
Uri uri=Uri.parse("content://cn.example.dwenzhao.contentprovider/data");
String selection="id=1";
int result=resolver.delete(uri,selection,null);


Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659