




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android 提供了5种方式存储数据-使用 SharedPreferences存储数据;-文件存储数据;-SQLite数据库存储数据;-使用ContentProvider存储数据;-网络存储数据一:使用 Shared Preferences 存储数据An droid提供的用来存储一些简单配置信息的一Map数据结构来存储数据,以键值的方式存储,首先说明Shared Preferences存储方式,它是 种机制,例如:登录用户的用户名与密码。其采用了 可以简单的读取与写入,具体实例如下:void ReadShared Preferen ces()Stri ng strName,str Passw
2、ord;Shared Preferencesuser = getShared Preferen ces“ user_ info ” ,0);strName = user.getString( “NAME ”,” ); strPassword = user getString( “PASSWORD”,” );void WriteShared Preferen ces(Stri ng strName,Stri ng strP assword)Shared Preferencesuser = getShared Preferen ces“ user_ info ” ,0);uer.edit();us
3、er.putString( “ NAME ” , strName);user.putString( “ PASSWORD ” ,strPassword);mit();数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改的数据。实际上Shared Preferences是采用了 XML格式将数据存储到设备中,在DDMS中的FileExplorer 中的 /data/data/<package name>/shares_prefs下。以上面的数据存储结果为例,打开后可以看到一个user_info
4、.xml的文件,打开后可以看到:<?xml version= ” 1.0" encoding=” UTF-8 " ?> <ma p><string name= ” NAME ” >moandroid</string><string name= ” PASSWORD” >SharedPreferences</string></ma p>使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用。 使用步骤:存数据:使用SharedPreferences保存
5、数据要经过4个步骤:获取对象、创建编辑器、修改内容、提交 修改。接下来就仔细查看这四个步骤究竟是怎样的一个过程:1. 获取对象通过getSharedPreferences()方法获取一个 SharedPreferences对象,以方便对其进行相关操作,方法如下:getSharedPreferences("Content", Context.MODE_PRIV ATE);2创建一个Editor编辑器在SharedPreferences中要编辑信息,必须取得一个编辑器,也就是 Editor。 Editor对象的作用是提供一些方法以便使用者修改XML文件中的内容,如添加字符串或整
6、数等。方法如下:Shared Preferen ces.edit();3.使用Editor修改内容Shared Preferences根据方法名创建一个<Stri ngx/Stri ng>节点,根据这个方法的参数向节点中添加内容。方法如下:putStri ng("Stri ng", data);4.提交内容将数据修改好之后,也就是 putString()或其他put()方法执行完后,要将这个修改提交给 SharedPreferences,以通知其将内容写入到XML文件中。使用的方法如下:mit();读数据:只要两个步骤就可以顺利取出保存的数据并使用:1.获得 S
7、haredPreferences对象获得的方法如下:getSharedPreferences("Content". Context.MODE_PRIV ATE); 2.取出Key对应的 Value即内容我们只要使用getStri ng()等方法就可以了:Shared Preferen ces.getStri ng()Shared Preferen ces.getBoolea n()Shared Preferen ces.getFloat()Shared Preferen ces.get In t()Shared Preferen ces.getL on g()二:文件存储数
8、据文件存储方式是一种较常用的方法,在An droid中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了 openFilelnput()和openFileOutput()方法来读取设备上的文件。 FilterInputStream, FilterOutputStream 等可以到 Java io package 说明中去详细学习,不再此 详细说明,具体实例如下:String fn =“ moan droid .log ” ;File Inpu tStream fis = openF ile Inpu t(fn);an droid sdk。1. 文件保存在哪里事实上,文件保存
9、的路径与SharedPreferences的保存路径差不多,位于/data/data/<packagename>/files 下。2. 文件操作的一些方法知道文件保存的位置和形式后,接下来需要知道操作文件的一些重要的方法,如表所示:操作文件的重要方法FileOut putStream fos = openF ileOut put(fn,Co ntext.MODE_ PRIV ATE); 除此之外,An droid还提供了其他函数来操作文件,详细说明请阅读openF ile Inpu t() openF ileOut pu t() deleteFile() fileList() ge
10、tFileDir() getCacheDir() getDir()含义打开应用程序文件以便读取创建应用程序文件以便写入通过名称删除文件获得所有位于/data/data/<package name>/files下的文件列表 获得 /data/data/<package name>/files 子目录对象 获得 /data/data/<p ackage n ame>/cache 子目录对象 根据名称创建或获取一个子目录在程序默认位置创建和写入文件我们知道在 Java中通过使用流来读写文件,要创建一个文件首先要建立一个输出流。在An droid中同样如此,我们依靠
11、openF ileOut pu t()来获得一个输出流。它将在上一节中展示的 位置创建一个文件,使用一个流要3个步骤:openFileOutput()方法可以很方便的获得,如下1. 获得一个输出流对象 获得一个输出流对象以进行文件操作,使用 所示:openFileOutput( “myFile.txt ”,Context.MODE_PRIV ATE);2. 向流中写入数据同样非常方便,使用write()获得了输出流之后我们需要向流中添加我们需要添加的信息了, 方法就可以了:write(data.getBytes();3. 关闭流当数据写入完毕后,使用close()方法可以关闭输出流,方法如下所
12、示:fos.close();在默认位置读取文件与上面类似,An droid提供了读取文件的简便方法,同样需要3个步骤:1. 创建输入流首先,得到了一个输入字节流,参数是文件名。fis = openFilelnput( “myFile ” );接着,将其转换为字符流,这样可以一个字符一个字符地读取以便显示中文。isr = new Inpu tStreamReader(fis);br = new BufferedReader(isr);最后,我们又将其包装为缓冲流,这样可以一段一段地读取,减少读写的次数,保护硬盘。read()方法而使用了readLi ne()方法,原因下2. 读取数据从流中获得数
13、据同样非常方便,这里没有使用文也会给出,代码如下:Stri ng s = n ull;S = (br.readLi ne();3. 关闭输入流这里记得每个流都要关闭哦:fis.closeO; isr.close(); br.close();三.SQLite数据库本节将讲解使用 An droid自带的关系型数据库一一SQLite。它是一个基于文件的轻量级数据 库,为嵌入式设备量身打造而成。每个应用程序创建的数据库都是私有的,但是 ContentProvider可以把数据共享给其他的应用程序。本节中读者将学习到创建和删除数据库,创建和删除表,以及插入记录、更新记录、删除记录和查询记录等操作。1.
14、怎样创建数据库创建数据库有多种方法,最简单的无疑是使用Context的openOrCreateDatabase()方法了。当然还有更加强大的方法,比如通过SQLiteO penH el per类更有效地管理它。使用openOrCreateDatabaseO方法创建数据库语法格式如下:Con textWra pp er.o penO rCreateDatabase(Stri ng n ame, int mode, CursorFactory factory)2. 数据库文件被保存在哪里事实上,与SharedPreferences类似,数据库文件被保存在如下的目录下:/data/data/pack
15、age n ame/databases3. 设置数据库创建完数据库后,为了更安全而有效地使用它,我们还需要对它进行一定的配置,主要的方法有3个,分别是:(1) 设置本地化:db.setLocale(Locale.getDefault();(2) 设置线程安全锁:db.setLock ingEn abled(true);(3) 设置版本:db.setVers ion ;4. 关闭数据库当我们不再需要使用数据库时可以考虑将其关闭,关闭的方法非常简单,只需要调用方法: db.close();5. 删除数据库有些时候基于某种需求我们需要将数据库彻底删除,方法同样非常简单:Con text.delete
16、DatabaseO;创建和删除表1.创建表创建了数据库之后,我们接下来的工作就是在数据库中创建表了,只有拥有了表,数据库才有意义。创建表的方法是执行相应的 SQL语句。例如,要创建一个名为userlnfo_brief的表, 需要的SQL语句为:CREATE TABLE userl nfo_brief (id INTEGER P RIMARY KEY AUTOINCREMENT, n ame TEXT,p assword TEXT);仓U建person表db.execSQL("CREATE TABLE person (_id INTEGER P RIMARY KEY AUTOINCRE
17、MENT, name V ARCHAR, age SMALLINT)");2.删除表相应的,如果要删除表 userlnfo_brief,其SQL语句为:DROP TABLE userI nfo_brief;与其对应的Java代码为:Sring sql =“DROP TABLE ” + TABLENAME_1 +“; ” ;db.execSQL(sql)操作记录操作记录大致为插入操作、更新操作以及删除操作。SQLiteDatabase类提供了 3个简单的方法来完成对应的操作,它们分别是:SQLiteDatabase.i nsert()SQLiteDatabase. up date()S
18、QLiteDatabase.delete()1.插入记录插入记录时,我们需要使用方法:SQLiteDatabase.i nsert(Stri ng table, String n ullColu mnH ack, Conten tValues values)/ContentValues以键值对的形式存放数据 Conten tValues cv = new Conten tValues(); cv.pu t(" name", person.n ame);cv.pu t("age", person .age); 插入ContentValues中的数据 db.
19、i nsert(” person", n ull, cv);2. 更新记录更新记录时,我们需要使用方法:SQLiteDatabase. up date(Stri ng table, Conten tValues values, String whereClause, Strin g whereArgs)3. 删除记录删除记录时,我们需要使用方法:SQLiteDatabase.delete(Stn ng table, String whereClause, Strin g whereArgs)1.使用queryO查询方法查询数据:Cursor c = db.rawQuery("
20、;SELECT * FROM person WHERE age >= ?", new Strin g"33");while (c.moveToNextO) int _id = c.get In t(c.getColu mnin dex("_id");String n ame = c.getStri ng(c.getColu mnIn dex(" name");int age = c.get In t(c.getColu mnin dex("age");c.close();删除数据db.delete(
21、" perso n", "age < ?", new Stri ng"35");关闭当前数据库db.close();/数据库提供了一些方法可以使我们很方便的执行查询,而避免了写一些繁琐的SELECT语句一脉相删除test.db数据库 deleteDatabase("test.db");SQLiteSELECT查询语句,当然,你也不必担心,因为它提供的方法其实与 承。其语法格式如下:SQLiteDatabase.query(Stri ng table, Strin g colu mns, String sele
22、cti on, Strin g select ion Args, String group By, String hav ing, String orderBy)2.使用Cursor对象保存查询结果执行完Cursor对象的方法;Cursor.getCount()获得Cursor对象中记录条数,可以理解为有几行。Cursor.getColumnCount(),获得Cursor对象中记录的属性个数,可以理解为有几列。 Cursor.moveToFirst(),将Cursor对象的指针指向第一条记录。Cursor.moveToNextO,将Cursor对象的指针指向吓一跳。Cursor.isAfte
23、rLast(),判断Cursor对象的指针是否指向最后一条记录。 Cursor.close(),关闭 Cursor 对象。Cursor.deactivate(),取消激活状态。Cursor.requery(),重新查询刷新数据。Cursor对象只能暂时地保存数据,如果只需要完成一些简单的操作可以快速地执行, 后关闭它。接下来学习一些经常使用的(1)(2)(3)(4)(5)(6)(7)(8)3. 执行查询操作4. 使用 SQLiteQueryBuilder如果我们需要执行多表查询就要使用SQLiteQueryBuilder,接下来我们需要执行多表查询:SELECTuser_brief. name
24、,User_brief. password,User_detail.age,User_detail.sexuser_brief, user_detailuser_brief. name = user_detail .n ame AND user_brief. name =“ wes”age ASCFROMWHEREORDERBY为了能更好地管理数据库,An droid SDK为我们提供了数据库的一个帮助类SQLiteOpenHelper。要使用SQLite OpenH el per类需要如下步骤:1. 继承 SQLite OpenH el per 类2. 得到帮助类的对象通过帮助类的构造方法可
25、以顺利地得到帮助类的对象:DatabaseHe Iper helper = new DatabaseHe lper(Con text con text, String n ame, CursorFactory factory, int version)3. 获得数据库顺利地获得数据库帮助类的对象后,无论在什么时候,我们都可以很方便地得到一个可读或者可写数据库,得到可写数据库的具体语法格式如下:SQLiteO penH el per.getWritableDatabase()或者可以通过以下方法得到可读数据库:SQLite OpenHelp er.getReadableDatabase()事务的
26、操作p ublic void add(List <Person> persons) db.beg inTransaction(); / 开始事务try for (Person person : persons) db.execSQL("INSERT INTO person VALUES (n ull,?, ?, ?)", newObject person.n ame, person, age, person .i nfo);db.setTra nsactio nSuccessful();/ 设置事务成功完成 fin ally db.e ndTra nsactio
27、 n();结束事务四:ContentProvider1、ContentProvider 简介当应用继承 ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其 他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用 sharedpreferences API读写数据。而使用 ContentProvider 共享数据的好处是统一了数据访问方式。2、Uri类简介Uri代表了要操作的数据,Uri主要包含了两部分信息:1.
28、需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:1. scheme: Co nte ntP rovider (内容提供者)的 scheme 已经由 An droid 所规定为:con te nt:/。(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:2. 主机名(或 Authority ):用于唯一标识这个ContentProvider,外部调用者可以根据这个标 识来找到它。3. 路径要操作要操作要操作con tact表中id为10的记录,可以构建这样的路径:/con tact/10co
29、n tact 表中 id 为 10 的记录的 n ame 字段,con tact/10/namecon tact表中的所有记录,可以构建这样的路径:/co ntact?要操作的数据不一定来自数据库,也可以是文件等其他存储方式,如下:要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:Uri uri = Uri. parse("c on te nt:/com.cha ngche ng. provider.c on tact provider/c on tact&
30、quot;) 3、UriMatcher、ContentUrist 和 ContentResolver 简介因为Uri代表了要操作的数据,所以我们很经常需要解析 Uri,并从Uri中获取数据。An droid 系统提供了两个用于操作 Uri的工具类,分别为UriMatcher和ContentUris。掌握它们的使 用,会便于我们的开发工作。UriMatcher :用于匹配 Uri,它的用法如下:1.首先把你需要匹配Uri路径全部给注册上,如下:/常量UriMatcher.NO_MA TCH表示不匹配任何路径的返回码(-1)。UriMatcher uriMatcher = new UriMatch
31、er(UriMatcher.NO_MATCH);如果 match()方法匹配己 conten t:/com.cha ngche ng.sqlite .p rovider.c on tact provider/c ontact 路径, 返回匹配码为1uriMatcher.addURI( “ com.cha ngche ng.sqlite .p rovider.c on tact provider ” , “ con tact ” , 1);/ 添力口 需要匹配uri,如果匹配就会返回匹配码2“ com.cha ngche ng.sqlite .p rovider.c on tact provid
32、er ” , “ con tact/# ” , 2);/# 号如果 match()方法匹配己 content:/vider.contactprovider/contact/230 路 径,返回匹配码为uriMatcher.addURI(为通配符Uri后,就可以使用 uriMatcher.match(uri)方法对输入的 Uri进行匹配,2. 注册完需要匹配的如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配conten t:/com.cha ngche ng.sqlite .p rovider.c ontactp
33、rovider/c on tact 路径,返回的匹配码为1。ContentUris :用于获取Uri路径后面的ID部分,它有两个比较实用的方法:withAppendedld(uri, id)用于为路径加上ID部分parseld(uri)方法用于从路径中获取ID部分ContentResolver :当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Activity 提供的 getC onten tResolver()方法。Conten tResolver 使用
34、in sert、delete、up date、query 方法,来操作数据。1. 什么是 ContentProviderContentProvider机制可以帮助开发者在多个应用中操作数据,包括存储、修改和删除等。这 也是在应用间共享数据的唯一方式。一个ContentProvider类实现了一组标准的接口,它们ContentP rovider.i nsert(Uri argO, Conten tValues arg1)ContentP rovider.query(Uri arg0, Strin g arg1, String arg2, Strin g arg3, String arg4) Co
35、ntentP rovider.u pdate(Un arg0, Conten tValues arg1, String arg2, Strin g arg3) Con te ntP rovider.delete(Uri arg0, Stri ng arg1, Stri ng arg2)ContentP rovider.getT yp e(Uri arg0)是:(1)(2)(3)(4)(5)2. 什么是URIURI是Universal Resource Identifier的缩写,也就是通用资源标志符的意思。它的作用就是告诉使用者,数据的具体位置,所以在URI中一定包含有数据的路径。事实上,在A
36、n droid的Uri中主要包括3个部分:"co nte nt: /”,An droid命名机制规定所有的内容提供者Uri必须以"con te nt: ”开数据路径,正如前文所说,通过该路径其他的应用程序可以顺利地找到具体数据。 ID,这个是可选的,如果不填表示取得所有的数据。(1) 头。(2)(3)3. Conten tResolverAn droid的数据共享机制中,Con te ntP rovider作为提供者出现,而Co nten tResolver则作为消费者出现。通过 getContentResolver()可以得到当前应用的ContentResolver对象。
37、要实现一个 ContentResolver同样需要实现 5个接口,与 ContentProvider 一一对应:(1)Conten tResolver. delete(Uri url, String where, Strin g select ion Args)(2)Conten tResolver . up date(Uri uri ,Conten tValuesvalues,Strin gwhere,Strin gselect ion Args)(3)Conten tResolver.query(Uriuri ,Strin g projecti on , Strin gselect ion
38、 , Strin gselecti on Args, Stri ng sortOrder)(4)ContentResolver. insert(Uri url , ContentValues values)(5)ContentResolver. getType(Uri url)获得手机中联系人的实例:(1) 查询联系人列表获得Cursor对象,方法为:man agedQuery(Uri uri, Strin gp rojecti on, String select ion, Strin g select ion Args, StringsortOrder)(2) 新建 Adapter:List
39、Ada pter ada pter = new SimpI eCursorAda pter(C on text con text, in t layout, Cursor c, Strin g from, i nt to)(3) 设置 AdaptersetListAda pter(ada pter);p rivate Strin gBuilder getC on tacts() Strin gBuilder sbLog = new Strin gBuilder();/ 得到 ContentResolver 对象Conten tResolver cr =this.getC on te ntRes
40、olver();/取得电话本中开始一项的光标,主要就是查询"contacts"表Cursor cursor = cr.query(Co ntactsCo ntract.Co ntacts.CONTENT_URI, null, null, null.null);if(!cursor.moveToFirst()sbLog.a ppen d("获取内容为空!");retur n sbLog;if(cursor.moveToFirst()/取得联系人名字(显示出来的名字),实际内容在 ContactsContract.Contacts中int name In d
41、ex = cursor.getColum nin dex(Co ntactsCo ntract.Co ntacts.DIS PLAY_NAME);String n ame = cursor.getStri ng(n ame In dex);sbLog.a ppen d(" name=" + n ame + "");/取得联系人IDString con tactId = cursor.getStri ng(cursor.getColu mnin dex(C on tactsC on tract.C on tacts._ID);根据联系人ID查询对应的电话号
42、码Cursor phon eNumbers =cr.query(Co ntactsCo ntract.Commo nDataKi nds. Phon e.CONTENT_URI, null.ContactsContract.CommonDataKinds.Phone.CONTACT ID + "="+ con tactId, n ull, n ull);/取得电话号码(可能存在多个号码) while (phon eNumbers.moveToNext()String strPhon eNumber =phon eNumbers.getStri ng( phon eNumbe
43、rs.getColu mnin dex(C on tactsCo ntract.Com mon DataKi nds.Phon e.NUMBER);sbLog.a ppen d(" Phon e=" + strPhon eNumber + "");phon eNumbers.close();/根据联系人ID查询对应的emailCursor emails =cr.query(Co ntactsCo ntract.Commo nDataK in ds.Email.CONTENT_URI, null.ContactsContract.CommonDataKin
44、ds.Email.CONTACT ID + "="+ con tactId, n ull, n ull);/取得email(可能存在多个email) while (emails.moveToNext()Stri ng strEmail =emails.getStri ng(emails.getColu mnIn dex(C on tactsC on tract.Com mon DataKi nds.Email.DATA);sbLog.a ppen d("Email=" + strEmail + "");emails.closeO;cursor.closeO;Log.e(”", sbLog.toStri ng();retur n sbLog;最后不要忘了加访问权限:view p lain1.2.3.<uses-p ermissionandroid:name ="android. permission.READ_CONTACTS" /><uses-p ermissionandroi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离职后的业绩核算协议
- 一年级德育评估与反馈计划
- 2025-2030年PC合金公司技术改造及扩产项目可行性研究报告
- 六年级体育赛事组织计划
- 2025-2030麦克风行业深度分析及发展趋势与投资前景研究报告
- 2025-2030轮式棒球包行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025-2030财富管理行业市场发展分析及前景趋势与投融资发展机会研究报告
- 2025-2030袋泡茶市场市场现状供需分析及投资评估规划分析研究报告
- 2025-2030虾干行业市场发展分析及发展前景与投资机会研究报告
- 辽宁石油化工大学《食品质量与安全专业外语》2023-2024学年第二学期期末试卷
- SHT+3413-2019+石油化工石油气管道阻火器选用检验及验收标准
- 电场电场强度
- 白酒质量要求 第4部分:酱香型白酒
- JT-T-329-2010公路桥梁预应力钢绞线用锚具、夹具和连接器
- 湖北武汉市2024届高三冲刺模拟数学试卷含解析
- 2024年浙江台州椒江区公安局警务辅助人员招聘笔试参考题库附带答案详解
- 土木工程专业毕业答辩常问问题
- 红色大气商务企业启动会企业启动仪式
- 2024年新改版苏教版六年级下册科学全册复习资料
- 手机制造行业未来五至十年行业分析
- 《发酵生物技术》课件
评论
0/150
提交评论