版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 数据持久化开发本章学习目标:本章要达到的主要目标:掌握使用SharedPreferences存储数据;掌握对文件的保存和读取操作;了解SQLite数据库的基本作用;掌握在Activity文件中操作SQLite数据库;掌握ContentProvider的使用。Android数据存储技术Android系统提供了以下五种主要的数据存储方式。1使用SharedPreferences存储数据2文件存储数据3SQLite数据库存储数据4使用ContentProvider存储数据5网络存储数据对于软件配置参数的保存,windows系统通常会采用ini文件保存,Java程序采用properties属性
2、文件或xml文件保存。类似的,Android平台提供了一个SharedPreferences接口用于保存参数设置等较为简单的数据 。使用SharedPreferences进行保存的数据,采用key=value键值对的形式进行保存一些简单的配置信息,信息以xml文件的形式存储在/data/data/shared_prefs目录下。要在Android程序中使用SharedPreferences组件必须在程序中使用下面语句。import android.content.SharedPreferences; /导入SharedPreferences类8.1 使用SharedPreferences存储数
3、据8.1 使用SharedPreferences存储数据方法描述public abstract SharedPreferences.Editor edit()使其处于可编辑状态public abstract boolean contains(String key)判断某一个key是否存在public abstract Map getAll()取出全部的数据public abstract boolean getBoolean(String key, boolean defValue)取出boolean型数据,并指定默认值public abstract float getFloat(String
4、key, float defValue)取出float型数据,并指定默认值public abstract int getInt(String key, int defValue)取出int型数据,并指定默认值public abstract long getLong(String key, long defValue)取出long型数据,并指定默认值public abstract String getString(String key, String defValue)取出String型数据,并指定默认值SharedPreferences对象只能获取数据不支持存储和修改,存储修改是通过andro
5、id. content.SharedPreferences.Editor接口来实现。8.1 使用SharedPreferences存储数据方法描述public abstract SharedPreferences.Editor clear()清除所有的数据public abstract boolean commit()提交更新的数据public abstract SharedPreferences.Editor putBoolean(String key, boolean value)保存一个boolean型数据public abstract SharedPreferences.Editor
6、putFloat(String key, float value)保存一个float型数据public abstract SharedPreferences.Editor putInt(String key, int value)保存一个int型数据public abstract SharedPreferences.Editor putLong(String key, long value)保存一个long型数据public abstract SharedPreferences.Editor putString(String key, String value)保存一个String型数据pub
7、lic abstract SharedPreferences.Editor remove(String key)删除指定key的数据 由于SharedPreferences和SharedPreferences.Editor两个都是接口,所以要想取得SharedPreferences接口的实例化对象,还需要Activity类中的几个常量和方法的支持。8.1 使用SharedPreferences存储数据常量及方法描述public static final int MODE_PRIVATE常量,创建的文件只能被一个应用程序调用,或者被具有相同id的应用程序访问public static final
8、 int MODE_WORLD_READABLE常量,允许其他应用程序读取文件public static final int MODE_WORLD_WRITEABLE常量,允许其他应用程序修改文件public SharedPreferences getSharedPreferences(String name, int mode)指定保存操作的文件名称,同时指定操作的模式,可以是MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE实现SharedPreferences存储的步骤如下: 1根据Context获取SharedPreference
9、s对象,例如:SharedPreferences sh= super.getSharedPreferences(my,Activity.MODE_PRIVATE);2利用edit()方法获取Editor对象,例如:SharedPreferences.Editor edit = sh.edit(); /获取Editor对象3通过Editor对象存储key-value键值对数据,例如:edit.putString(college, “zzu) ; /保存字符串edit.putInt(students, 20000); /保存整型4通过commit()方法提交数据,例如:mit() ; /提交更新8
10、.1 使用SharedPreferences存储数据实例8-1:使用SharedPreferences保存数据实例private static final String FILENAME = “zzu; /定义文件名 public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);/指定操作的文件名称SharedPreferences sh=super.getSharedPreferences(FILENAME,C
11、ontext.MODE_WORLD_READABLE); SharedPreferences.Editor edit = sh.edit(); /编辑文件 edit.putString(college, “zzu) ; /保存字符串 edit.putInt(students, 20000); /保存整型 mit() ; /提交更新8.1 使用SharedPreferences存储数据实现SharedPreferences读取数据的步骤如下: 1定义TextView对象,用于显示读取的数据,例如:private TextView college = null ;/定义文本显示组件private
12、TextView students = null ;/定义文本显示组件2根据Context获取SharedPreferences对象,例如:SharedPreferences sh = super.getSharedPreferences(“my”,Activity.MODE_PRIVATE); 3通过getString()方法获得字符数据,getInt()获得数字数据;this. college.setText(学校: + sh.getString(college , 没有学校信息。);this. students.setText(学生数: + sh.getInt(students , 0)
13、; 8.1 使用SharedPreferences存储数据实例8-2:使用SharedPreferences读取数据实例SharedPreferences对象实现数据的存储和读取的数据比较简单,只能是boolean,int,float,long和String五种简单的数据类型,如果想存储更多类型的数据,则可以使用文件的存储操作。8.1 使用SharedPreferences存储数据8.2 使用文件存储数据方法描述public FileInputStream openFileInput(String name)设置要打开的文件输入流public FileOutputStream openFile
14、Output(String name, int mode)设置要打开文件的输出流,指定操作的模式 public Resources getResources()返回Resources对象创建及写文件的步骤如下:1调用OpenFileOutput()方法,传入文件的名称和操作的模式,该方法将返回一个文件输出流,例如:FileOutputStream output = null ; /定义文件输出流对象output = super.openFileOutput(my.txt, Activity.MODE_PRIVATE); /设置输出的文件名及文件创建模式2调用write()或println()方
15、法,向该文件输出流写入数据,例如:PrintStream out = new PrintStream(output) ;/封装打印流out.println(学院:信息学院,);/输出数据out.println(专业:信息工程,) ; /输出数据out.println(班级:信工12-2BF。) ;/输出数据3调用Close()方法,关闭文件输出流,例如:out.close() ; /关闭输出流手机内存中的文件存储和读取实例8-3:创建文件实例8.2 使用文件存储数据直接打开DDMS视图, “/data/data/包名/files/” 文件夹中有刚才建立的文件,如图所示,导出这个文件,其内容如图
16、所示。1定义TextView对象,用于显示读取的文件内容,例如: private TextView fileread = null ;2调用OpenFileInput()方法,传入需要读取数据的文件名,该方法将会返回一个文件输入流对象,例如: FileInputStream input = null;/定义文件输入流对象input = super.openFileInput(“my.txt”); /获得指定的文件3调用read()方法或scannext()方法读取文件的内容,例如:Scanner scan = new Scanner(input) ; /定义Scannerwhile(scan.
17、hasNext() /循环读取this. fileread.append(scan.next() + “n”) ; /设置文本4调用Close()方法,关闭文件输入流。scan.close() ; /关闭输入流8.1 读取文件的步骤实例8-4:读取文件实例8.2 使用文件存储数据手机内存相对较小,其空间的大小会影响到手机运行速度,不建议将一些大数据保存到手机内存中,通常建议将这些资源存放在外存设备上,最常见的就是SD卡。8.2.2 SD卡中的文件存储和读取读、写SD卡上的文件步骤如下:1调用Environment的getExternalStorageState()方法判断手机上是否插入了SD卡
18、,并且应用程序具有读写SD卡的权限。 Environment.getExternalStorageState()方法用于获取SD卡的状态,如果手机装有SD卡,并且可以进行读写,那么方法返回的状态为Environment.MEDIA_MOUNTED;例如:if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)8.2.2 SD卡中的文件存储和读取读、写SD卡上的文件步骤如下:2调用Environment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录(这
19、里的目录是storagesdcardzzu,文件是zzu.txt);例如:File file = new File(Environment.getExternalStorageDirectory().toString()+ File.separator + zzu+ File.separator + zzu.txt) ; /定义File类对象 8.2.2 SD卡中的文件存储和读取读、写SD卡上的文件步骤如下:3使用FileInputStream、FileOutputStream、FileReader、FileWriter等类读、写SD卡里的文件;例如:PrintStream out = nul
20、l ;/打印流对象用于输出out = new PrintStream(new FileOutputStream(file, true);/追加文件out.println(“郑州大学信息学院信工12-2BF);4调用Close()方法,关闭文件输入流。out.close() ; /关闭输入流8.2.2 SD卡中的文件存储和读取读、写SD卡上的文件步骤如下:5为了读、写SD卡上的数据,必须在应用程序的清单文件(AndroidManifest.xml)中添加读、写SD卡的权限。8.2.2 SD卡中的文件存储和读取实例8-5:往SD上写入文件8.2.2 SD卡中的文件存储和读取实例8-6:从SD卡上读
21、取文件8.2.2 SD卡中的文件存储和读取在Android中,还可以对资源文件进行读取(注意不能写入),这些资源文件的ID都会自动的通过R.java这个类生成,如果要对这些文件读取,使用android.content.res.Resources类完成,常见的资源文件有两种,使用两种不同的方式进行打开使用。Raw中资源文件使用getResources().openRawResource(int id)读取,asset中资源文件使用getResources(). getAssets(). open(fileName)读取。8.2.3 读取资源文件实例8-7:读取asset中的资源文件8.2.3 读
22、取资源文件实例8-8:读取raw中的资源文件8.2.3 读取资源文件对于大量的数据处理,前面介绍的方法就显得力不从心了,在Android平台上,集成了一个嵌入式关系型数据库SQLite,SQLite支持 SQL 语言,可以方便的实现数据增加、修改、删除、查询等操作,支持的常见的五种数据类型。8.3 使用数据库存储数据SQLite的发展2000年由D.Richard Hipp开始开发2001年发布2.0v2004年发布3.0v(采用了不同的数据文件格式以及编程接口)目标易于管理、操作、维护、自定义以及提供易用的编程接口SQLite的优势内存占用量小速度比MySQL快(2倍), 比PostgreS
23、QL快(由加州大学伯克利分校计算机系开发,20倍)ACID兼容(原子性,一致性,独立性,可持久性),支持视图,子查询,触发器单个库文件中包含数据库引擎与接口,且其运行不依赖其它库可以将数据放进单个文件为Java,C/C+, Perl, PHP等应用提供了接口免费,允许动态添加自定义函数(简单函数及聚集函数),而无需重编SQLite库SQLite的缺点事务处理并发性性能在创建索引( CREATE INDEX)和删除表( DELTE TABLE)时明显比其它数据库慢用户管理/安全数据库的访问是基于操作系统对文件的控制来控制的,不能通过用户来区分数据库中的不同数据库.举例,将数据库文件去写权限,然后
24、向其中插入或删除数据条目,将提示写失败。但是不能通过数据库本身的来对权限进行设置。SQLite的内部结构在内部,SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。所有 SQL 语句都被编译成易读的、可以在 SQLite 虚拟机中执行的程序集。SQLite数据库的使用SQLite命令行接口SQLite除库本身外,还包含命令行接口,可以在$SQLITE_HOME/bin下发现sqlite/sqlite3,命令行功能介绍运行方式:sqlite3 DBFile得到提示符s
25、qlite运行.help(注意sqlite命令行提供的命令都以”.”开头,可以看到sqlite命令行接口提供下面的功能.SQLite命令行功能简介SQLite命令行功能简介DML/DDL语句的使用和其他数据库一致,不做介绍.databases 列出数据库文件名.tables ?PATTERN? 列出?PATTERN?匹配的表名.import FILE TABLE将文件中的数据导入的文件中.dump ?TABLE? 生成形成数据库表的SQL脚本.output FILENAME 将输出导入到指定的文件中.output stdout 将输出打印到屏幕.mode MODE ?TABLE? 设置数据输出
26、模式(csv,html,tcl.nullvalue STRING用指定的串代替输出的NULL串.read FILENAME执行指定文件中的SQL语句.schema ?TABLE?打印创建数据库表的SQL语句 .separator STRING 用指定的字符串代替字段分隔符.show 打印所有SQLite环境变量的设置.quit 退出命令行接口SQLite命令行功能使用下面举例说明SQLITE命令行的常规使用:SQLite数据导入创建数据文件data.txt(用逗号分隔):id, name,gender, age1,dq,male,242,jz,female,273.pp,male,264,cj
27、,male,285,zc,male,25创建数据库表五种数据类型 TEXT,NUMERIC,INTEGER,REAL,NONE数据类型的转换:向保存的目标类型转换,如将text保存到integer数据库表创建 shell sqlite3 test.dbsqlite create table employee( id integer primary key, name text, gender text, age integer );SQLite命令行功能使用数据导入.show之后可以看到 separator: “|”,也就是说系统默认的分隔符为”|”面不是”,”,下面修改分隔字符:sqlite
28、.separator “,”sqlite.import data.txt employee上面这句用来说明textinteger(这个和比较字符的内码得到的结果是相同的)数据查询sqlite select * from employee where id 2;SQLite命令行功能使用SQLite数据导出将数据表导出为数据创建脚本sqlite .dump employee 上面的命令可以得到数据表相关的SQL语句,为了将输出保存的文件中,执行下面的命令。sqlite .output create.sqlsqlite .dump employeesqlite .output stdout(将输出
29、恢复到标准输出)将特定数据导出成数据文件sqlite .output data_tmp.htmlsqlite select * from employee;sqlite .mode html employeesqlite select * from employee;sqlite .output stdout上面的几条命令将employee中的数据以html 的格式保存到data_tmp.html中.在Android系统中,通过android.database.sqlite.SQLiteDatabase类可以执行SQL语句,以完成对数据表的增加、修改、删除、查询等操作,在此类之中定义了基本的数
30、据库执行SQL语句的操作方法以及一些操作的模式常量。8.3 使用数据库存储数据常量或方法描述public static final int OPEN_READONLY常量,以只读方式打开数据库public static final int OPEN_READWRITE常量,以读/写方式打开数据库public static final int CREATE_IF_NECESSARY常量,如果指定的数据库文件不存在,则创建新的public static final int NO_LOCALIZED_COLLATORS常量,打开数据库时,不对数据进行基于本地化语言的排序public void beg
31、inTransaction()开始事务public void endTransaction()结束事务,提交或者是回滚数据public void close()关闭数据库public void execSQL(String sql)执行SQL语句public void execSQL(String sql, Object bindArgs)执行SQL语句,同时绑定参数public static SQLiteDatabase openDatabase(String path, SQLiteDatabase. CursorFactory factory, int flags)以指定的模式打开指定路
32、径下的数据库文件public static SQLiteDatabase openOrCreateDatabase(File file, SQLiteDatabase. CursorFactory factory)打开或者是创建一个指定路径下的数据库8.3 使用数据库存储数据常量或方法描述public static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase. CursorFactory factory)打开或者是创建一个指定路径下的数据库public long insert(String table, Str
33、ing nullColumnHack, ContentValues values)插入数据,table为表名称,nullColumnHack表示传入的valuesnull,则列被设为null,values表示所有要插入的数据public long insertOrThrow(String table, String nullColumnHack, ContentValues values)插入数据,但会抛出SQLException异常public int update(String table, ContentValues values, String whereClause, String
34、whereArgs)修改数据,table为表名称,values为更新数据,whereCluause指明WHERE子句,whereArgs为WHERE子句参数,用于替换“?”public int delete(String table, String whereClause, String whereArgs)删除数据,table为表名称,whereClause指明WHERE子句,whereArgs为参数,用于替换“?”public boolean isOpen()判断数据库是否是已打开public void setVersion(int version)设置数据库的版本public Curso
35、r query (boolean distinct, String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy, String limit)执行数据表查询操作,其中的参数有distinct(是否去掉重复行)、table(表名称)、columns(列名称)、selection(WHERE子句)、selectionArgs(WHERE条件)、groupBy(分组)、having(分组过滤)、orderBy(排序)、limit(
36、LIMIT子句)public Cursor query(String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy)执行数据表查询操作public Cursor rawQuery(String sql, String selectionArgs)执行指定的SQL查询语句SQLiteDatabase类本身只是一个数据库类,但是如果要想进行数据库的操作,还需要一个android.database. sqlite. SQLiteO
37、penHelper数据库操作辅助类帮助下才可以进行,SQLiteOpenHelper类是一个抽象类,它的常用方法如表所示。使用的时候需要定义其子类,并且在子类中要覆写相应的抽象方法。 8.3 使用数据库存储数据方法描述public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)通过此构造方法指明要操作的数据库名称以及数据库的版本编号public synchronized void close()关闭数据库public synchronized SQ
38、LiteDatabase getReadableDatabase()以只读的方式创建或者打开数据库public synchronized SQLiteDatabase getWritableDatabase()以修改的方式创建或者打开数据库public abstract void onCreate(SQLiteDatabase db)创建数据表public void onOpen(SQLiteDatabase db)打开数据表public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)更新数据
39、表在SQLiteDatabase类之中专门提供了增加、删除、修改、查询等方法,在使用这些方法进行数据库操作的时候,所有的数据必须使用android.database.ContentValues类进行封装,ContentValues类常用的方法如表所示。8.3 使用数据库存储数据方法描述public ContentValues()创建ContentValues类实例public void clear()清空全部的数据public void put(String key, 包装类 value)设置指定字段(key)数据public Integer getAs包装类(String key)根据key
40、取得数据,例如:getInteger()public int size()返回保存数据的个数1创建数据库Android提供了SQLiteOpenHelper帮助创建数据库,只要继承 SQLiteOpenHelper类,就可以创建数据库了,在SQLiteOpenHelper 的子类中,需要实现下面几个方法: 1)构造函数,调用父类 SQLiteOpenHelper 的构造函数,例如:DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version) super(context, name,
41、cursorFactory, version); 这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个正在使用的数据库模型版本的整数。8.3.1 创建数据库及表1创建数据库2)onCreate()方法,生成相应的数据表,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据,例如:public void onCreate(SQLiteDatabase db) /创建数据库后,对数据库的操作8.3.1 创建数据库及表1创建数据库3)onUpgrage()方法,当数据库版本要升级时会调用此方
42、法,例如:public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,一般可以在此方法中将数据表删除。4)onOpen()方法,当数据库打开时会调用这个方法,例如:public void onOpen(SQLiteDatabase db) super.onOpen(db); /每次成功打开数据库后首先被执行8.3.1 创建数据库及表2创建数据表调用getReadableDatabase()或getWriteableDat
43、abase()方法,可得到 SQLiteDatabase 实例,具体调用哪个方法,取决于是否需要改变数据库的内容,例如:db=(new DatabaseHelper(getContext().getWritableDatabase(); return (db = null) ? false : true;上面这段代码会返回一个 SQLiteDatabase 类的实例,使用这个对象就可以查询或者修改数据库。当完成了对数据库的操作(例如Activity已经关闭),需要调用SQLiteDatabase的Close()方法来释放掉数据库连接。8.3.1 创建数据库及表2创建数据表1)创建表和索引为了创
44、建表和索引,需要调用SQLiteDatabase的execSQL()方法来执行相应的语句,例如:创建一个名为mytable的表,表有一个列名为_id,并且是主键,这列的值会自动增长,另外还有两列:title(字符)和value(浮点数),代码如下:db.execSQL(CREATE TABLE mytable(_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL););通常情况下,SQLite会自动为主键列创建索引。8.3.1 创建数据库及表实例8-9:创建数据库及表实例8.3.1 创建数据库及表使用SQLiteDataba
45、se进行数据库操作的步骤如下:1获取SQLiteDatabase对象,它代表了与数据库的连接;MainActivity.this.helper.getWritableDatabase(); /取得可写的数据库2定义要执行的SQL语句;例如:String sql = INSERT INTO + TABLENAME + (name,sex,DateofBorth,email) VALUES (+ name + , + sex + , + DateofBorth + , + email + ); 3执行定义好的SQL语句;例如:this.db.execSQL(sql); /执行SQL语句4关闭SQL
46、iteDatabase,回收资源。例如:this.db.close() ;8.3.2 操作数据库实例8-10:操作数据库实例8.3.2 操作数据库当Android程序需要进行数据查询操作的时候需要保存全部的查询结果,而保存查询结果可以使用android.database.Cursor接口完成。Cursot接口没有提供方法直接控制指针移动,如果要想从前到后依次取得全部数据记录就要使用isAfterLast()、moveToNext()、moveToFirst()三个方法,按照如下步骤进行: 1)使用moveToFirst()方法将结果集的指针放在第一行数据; 2)随后使用isAfterLast(
47、)方法判断是否还有数据,如果还有数据,则进行取出; 3)再随后利用moveToNext()将指针向下移动,并继续使用isAfterLast()方法判断; 8.3.3 数据查询操作8.3.3 数据查询操作8.3.3 数据查询操作用如下代码表示:for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()循环体; 其中result表示查询到记录的集合。实例8-11:数据库查询操作实例8.3.3 数据查询操作ContentProvider(内容提供者)它是一个类,这个类主要是对Android系统中进行共享的数据进行包装,并
48、提供统一的访问接口供其他程序调用。这些被共享的数据,可以是系统提供的也可以是某个应用程序中的数据,ContentProvider使用表的形式来组织数据。一个应用可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。外界可以通过这些接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据。8.4 使用ContentProvider存储数据1ContentProvider类8.4 使用ContentProvider存储数据方法描述public abstract boolean onCreate()当启动此组件的时候调用public abstract int de
49、lete(Uri uri, String selection, String selectionArgs)根据指定的Uri删除数据,并返回删除数据的行数public final Context getContext()返回Context对象public abstract String getType(Uri uri)根据指定Uri,返回操作的MIME类型public abstract Uri insert(Uri uri, ContentValues values)根据指定的Uri进行增加数据的操作,并且返回增加后的Uri,在此Uri中会附带有新数据的_idpublic abstract Cu
50、rsor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder)根据指定的Uri执行查询操作,所有的查询结果通过Cursor对象返回public abstract int update(Uri uri, ContentValues values, String selection, String selectionArgs)根据指定的Uri进行数据的更新操作,并返回更新数据的行数2Uri类使用ContentProvider类进行数据操作,采用Uri的形式进行数据的交换
51、,Uri代表了要操作的数据,Uri主要包含了两部分信息:1)需要操作的ContentProvider,2)对ContentProvider中的什么数据进行操作。一个Uri一般由以下几部分组成:协议部分:ContentProvider(内容提供者)访问协议,已经由Android所规定为:content:/主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它,一般都为程序的“包.类”名称,要采用小写字母的形式表示;Path部分:访问的路径,一般都为要操作的数据表的名称。8.4 使用ContentProvider存储数据2Uri类例如:c
52、ontent:/org.demo.personprovider/person的含义就是访问person表中所有记录。content:/org.demo.personprovider/person/5的含义就是访问person表中的id为5的记录。content:/org.demo.personprovider/person/5/name的含义就是访问person表中的id为5的记录的name字段数据。8.4 使用ContentProvider存储数据方法描述public static String decode(String s)对字符串进行编码public static String enc
53、ode(String s)对编码后的字符串进行解码public static Uri fromFile(File file)从指定的文件之中读取URIpublic static Uri withAppendedPath(Uri baseUri, String pathSegment)在已有地址之后添加数据public static Uri parse(String uriString)将给出的字符串地址变为Uri对象3使用ContentResolver操作ContentProvider中的数据当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用Con
54、tentResolver 类来完成。8.4 使用ContentProvider存储数据方法描述public final int delete(Uri url, String where, String selectionArgs)调用指定ContentProvider对象中的delete()方法public final Uri insert(Uri url, ContentValues values)调用指定ContentProvider对象中的insert()方法public final Cursor query(Uri uri, String projection, String sele
55、ction, String selectionArgs, String sortOrder)调用指定ContentProvider对象中的query()方法public final int update(Uri uri, ContentValues values, String where, String selectionArgs)调用指定ContentProvider对象中的update()方法使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作:ContentResolver resolver = getContentResolver(
56、);Uri uri = Uri.parse(content:/org.demo.personprovider/person);ContentValues values = new ContentValues();/添加一条记录values.put(name, xiaowang);values.put(sex, 男);resolver.insert(uri, values); 8.4 使用ContentProvider存储数据/获取person表中所有记录Cursor cursor = resolver.query(uri, null, null, null, personid desc);wh
57、ile(cursor.moveToNext() Log.i(ContentTest,personid=+cursor.getInt(0)+ ,name=+ cursor.getString(1); /把id为1的记录的name字段值更改新为zhangsanContentValues updateValues = new ContentValues();updateValues.put(name, zhangsan);Uri updateIdUri = ContentUris.withAppendedId(uri, 2);resolver.update(updateIdUri, updateVa
58、lues, null, null);Uri deleteIdUri = ContentUris.withAppendedId(uri, 2); /删除id为2的记录resolver.delete(deleteIdUri, null, null);8.4 使用ContentProvider存储数据4UriMatcher类Uri代表了要操作的数据,经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。8.4 使用ContentProvider存储数据方法描述public static final int
59、NO_MATCH表示一个-1的整型数据,在实例化对象时使用public UriMatcher(int code)实例化UriMatcher类对象public void addURI(String authority, String path, int code)增加一个指定的URI地址public int match(Uri uri)与传入的Uri进行比较,如果匹配成功,则返回相应的code,如果匹配失败则返回-1如果希望数据能够共享,要么建立一个自己的ContentProvider;要么将自己的数据添加到已经存在的Content Provider。ContentProvider类的开发比较麻
60、烦,因为涉及的类很多。系统也为用户开发了许多的ContentProvider,一般需要知道Uri的协议,才能操作这些ContentProvider。8.4 使用ContentProvider存储数据Android系统提供了多种数据类型的ContentProvider(声音,视频,图片,联系人等),它们大都位于vider包中,例如:Browser:读取或修改书签,浏览历史或网络搜索;CallLog:查看或更新通话历史;Contacts:获取,修改或保存联系人信息;LiveFolders:由Content Provider提供内容的特定文件夹;MediaStore:访问声音,视频和图片;Setti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 会计类毕业实习报告范文锦集六篇
- 下学期工作学习计划合集八篇
- DB12T 472-2012 贵金属与珠宝玉石饰品 标识
- 业务员工作心得体会
- 三国演义读书笔记及启发范文
- 个人篮球训练计划书(12篇)
- 课件高血压教学课件
- 探究实验设计之二氧化碳性质的探究
- 慢性持续期哮喘患者的治疗和管理
- 高等数学教程 试卷3-答案
- 《员工心理健康》课件
- 微型站消防站课件培训
- 北京市丰台区2023-2024学年七年级上学期期末数学试题
- 计算思维与程序设计
- 主题漫展策划方案
- 小学生自主学习能力培养及教师指导策略
- 财务管理的数字化转型实施方案
- 线上厨艺大赛投票方案
- 家长课程:怎样提升孩子的自护技能
- 奥纬咨询-2023京东营销策略洞察报告
- 人工智能在医疗领域的应用课件
评论
0/150
提交评论