第四章数据存储_第1页
第四章数据存储_第2页
第四章数据存储_第3页
第四章数据存储_第4页
第四章数据存储_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第9章章 数据存储数据存储Android中5种数据存储方式 使用SharedPreferences临时文件存储首选项 文件存储数据 SQLite数据库存储数据 使用contentprovider存储数据(主要实现数据共享) 网络存储数据第一节第一节SharedPreferencesSharedPreferencesv1、存储临时性数据,保证下一次进入该系统、存储临时性数据,保证下一次进入该系统,能够获取该文件的数据,进行操作。,能够获取该文件的数据,进行操作。存储数据和读取数据的流程:存储数据和读取数据的流程:v 存储数据信息存储数据信息v 1)打开名为configuration的配置文件,

2、如果存在则打开它,否则创建新的名为configuration的配置文件v SharedPreferences sharedPreferences = getSharedPreferences(configuration, 0);v 2)让sharedPreferences处于编辑状态v SharedPreferences.Editor editor = sharedPreferences.edit();v 3)存放数据v editor.putString(name,harvey);v 4)完成提交v mit();v 读取数据信息读取数据信息v 1)打开名为configuration的配置文件v

3、 SharedPreferences sharedPreferences = getSharedPreferences(configuration, 0);v 2)获取数据v String name = sharedPreferences.getString(name,默认值);获取获取SharedPreferences对象方法对象方法vSharedPreferences pre = Context.getSharedPreferences(String name,int mode);v注:name为本组件的配置文件名(如果想要与本应用程序的其他组件共享此配置文件,可以用这个名字来检索到这个配

4、置文件,在这里要特别注意,因为在Android 中已经确定了SharedPreferences 是以xml形式保存,所以,在填写文件名参数时,不要给定“.xml”后缀,android会自动添加。只要直接写上文件名即可。它会直接被保存在/data/data/shared_prefs路径下,它是采用键值对的形式保存参数。当你需要获得某个参数值时,按照参数的键索引即可)。 vSharedPreferences支持的三种访问模式(这三种模式可以由Activity调用:v1、 MODE_PRIVATE:只有创建这个SharedPreferences的Activity与权限读写它。v2、 MODE_WOR

5、LD_READABLE: 其他Activity对这个SharedPreferences具有可读权限。v3、 MODE_WORLD_WRITEABLE:其他Activity对这个SharedPreferences也具有可读可写的权利练习练习第二节第二节文件存储文件存储简介简介v利用利用SharedPreferences只能保存简单的数据,只能保存简单的数据,要存储更多类型的数据,则需要使用文件的存储操要存储更多类型的数据,则需要使用文件的存储操作。对于文件的存储操作,在作。对于文件的存储操作,在Android中有两种形中有两种形式。式。v1、直接利用、直接利用Activity 提供的文件操作方法

6、。此类提供的文件操作方法。此类操作的所有文件路径只能是操作的所有文件路径只能是“datadatafiles文件文件名称名称”v2、利用、利用java IO流执行操作。此类操作的文件可流执行操作。此类操作的文件可以是任意路径(包括以是任意路径(包括sdcard)下,但是需要为其操下,但是需要为其操作授权。作授权。File类简介类简介v在在java中,中,File类既可以表示文件又可以表类既可以表示文件又可以表示目录,它提供了操作文件或目录的一组方示目录,它提供了操作文件或目录的一组方法法v 1: File f = new File(F:javarose); (其中其中F:javarose是一个已

7、经存在的目录是一个已经存在的目录),你可以调用,你可以调用file.exists()看看目录是否存在,如存在则函数返回目录是否存在,如存在则函数返回true,如不存在你可以调用,如不存在你可以调用 file.mkdir(); 创建创建rose目录目录。v 2: File file=new(f,“file1.txt”);可以实例化可以实例化F:javarose目录下的文件目录下的文件file1.txt(文件已存在文件已存在),你可以调用,你可以调用file.exists()看文看文件是否存在,如存在则函数返回件是否存在,如存在则函数返回true,如不存在你可以调用,如不存在你可以调用 file.

8、createNewFile()创建创建 file1.txt文件。注意,当你实例化一个文件。注意,当你实例化一个已经存在的文件时,一定要加上后缀名,如已经存在的文件时,一定要加上后缀名,如.txt等,否则实例化的文件等,否则实例化的文件是不存在的。调用是不存在的。调用file.exists()返回返回false.Environment类简介类简介v Environment 是一个提供访问环境变量的类是一个提供访问环境变量的类。v Environment 常用方法:常用方法:v 01.方法:方法:getDataDirectory() v 02.解释:返回解释:返回 File ,获取,获取 Andr

9、oid 数据目录数据目录。 v 03.方法:方法:getDownloadCacheDirectory() v 04.解释:返回解释:返回 File ,获取,获取 Android 下载下载/缓存内容目录。缓存内容目录。v 05.方法:方法:getExternalStorageDirectory()v 06.解释:返回解释:返回 File ,获取外部存储目录即,获取外部存储目录即 SDCard v 07.方法:方法:getExternalStoragePublicDirectory(String type)v 08.解释:返回解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些,取一

10、个高端的公用的外部存储器目录来摆放某些类型的类型的文件文件 v 09.方法:方法:getExternalStorageState() v 10.解释:返回解释:返回 File ,获取外部存储设备的当前,获取外部存储设备的当前状态状态 v 11.方法:方法:getRootDirectory() v12.解释:返回解释:返回 File ,获取,获取 Android 的根目录的根目录文件字节输入文件字节输入/输出流输出流v文件字节输入文件字节输入/输出输出流是指流是指FileInputStream 和和FileOutputStream类,它们实现了对文类,它们实现了对文件的顺序访问,并以字节为单位进

11、行读件的顺序访问,并以字节为单位进行读/写操写操作作vFileOutputStream用于将字节数据写出用于将字节数据写出到文件。继承自到文件。继承自OutputStream类类构造方法摘要构造方法摘要FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。FileOutputStream(FileDescriptor fdObj) 创建一个向指定文件描述符处写入数据的输出文件流,

12、该文件描述符表示一个到文件系统中的某个实际文件的现有连接。FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。常用方法Close():关闭缓冲输出流并释放与此流有关的所有系统资源。Write(int b): 将指定的字节写入此缓冲输出流Write(byte b):将b.length个字节写入此缓冲输出流。案例案例vFile file=new file(“d:test.txt);vFil

13、eOutputStream fos=new FileOutputStream(file);vString x=“iamok”vFos.write(x.getbytes()vFos.closeFileInputStreamv一、构造方法一、构造方法v FileInputStream(String name); /使用给定的文件名创建对象使用给定的文件名创建对象v FileInputStream(File file); /使用使用File对象创建对象创建FileInputStream对对象象v 二、读取文件二、读取文件v 1.使用文件输入流读取文件使用文件输入流读取文件v FileInuputSt

14、ream istream=new ileInputStream(myfile.dat);v 或:或:v File f=new File(myfile.dat);v FileInputStream istream=new FileInputStream(f);v 构造方法可能会产生异常构造方法可能会产生异常IOException,故为了把一个文件输入流对象与一个故为了把一个文件输入流对象与一个文件关联起来,需:文件关联起来,需:v try FileInputStream ins=new FileInputStream(myfile.dat);v catch (IOException e) Sys

15、tem.out.println(File read error:+e);v 2.从输入流中读取字节从输入流中读取字节v int read(); /从输入流中读取单个字节数据(从输入流中读取单个字节数据(0255),如到输入流末尾),如到输入流末尾则返回则返回-1v int read(byte b); /读多个字节读多个字节v int read(byte b,int off,int len);v 3.关闭流关闭流v Java在程序结束时自动关闭所有打开的流,但显式关闭任何打开的流是一个好在程序结束时自动关闭所有打开的流,但显式关闭任何打开的流是一个好习惯。习惯。v close(); FileIn

16、putStream使用案例使用案例v FileInputStream f=FileInputStream(/home/software./root/ends,jsp);BufferedInputStream bu=new BufferedInputStream(f);byte a=new byte10;int n;while(n=bu.read(a)!=-1)String s=new String(a,o,n)out.println(s);f.close();bu.close();read返回的是一个整型的数,当到文件的尾时候返回返回的是一个整型的数,当到文件的尾时候返回-1,也就是说也就是说

17、read一次读取的字节数为字节数组的长度。一次读取的字节数为字节数组的长度。SQLite简单介绍 vSQ为Structured Query (结构化查询)的缩写,Lite表示轻量级。SQLite是一款开源的关系型数据库。几乎可以支持所有现代编程语言和各种操作系统v对SQLite数据库的操作一般包括:创建一个数据库,打开数据库,关闭数据库,删除数据库。创建和打开数据库的方法: v 使用openOrCreateDatabase()方法来创建,若数据库不存在,则会创建新数据库,若存在,则打开数据库。 v openOrCreateDatabase()方法的返回值为一个SQLiteDatabase对象

18、v openOrCreateDatabase()方法的官方说明v public SQLiteDatabase openOrCreateDatabase (String name, int mode, SQLiteDatabase.CursorFactoryfactory)v 第一个参数为数据库的名字,string类型。v 第二个参数为常量,如下所示常量 含义MODE_PRIVATE 默认模式,值为0,文件只可以被调用该方法的应用程序访问v MODE_WORLD_READABLE 所有的应用程序都具有对该文件读的权限。v MODE_WORLD_WRITEABLE 所有的应用程序都具有对该文件写的

19、权限。v 第三个参数当query方法被调用时,用来实例化cursor,通常为null例如:SQLiteDatabase sld=this.openOrCreateDatabase(“teacher.db,0,null);v关闭SQLite数据库v对数据库操作完毕之后,就要关闭数据库,否则会抛出SQLiteException异常。关闭数据库只需调用成SQLiteDatabase对象的.close()方法即可。例如:sld.close()删除数据库v直接调用deleteDatabase()方法即可,如:例如:this.deleteDatabase (“teacher.db);SQLite数据库中(

20、Table )“表”的操作方法 v 首先要明确一点的是,一个数据库可以有很多表,一个表中包含很多条数据,也就是说,在数据库里面保存数据其实是保存在Table (表)里面的。对已经存在和已经创建的数据库操作一般包括:创建表,往表添加数据,从表中删除数据,修改表中的数据,查询表中的数据,删除已存在的表。 创建一个表v通过调用数据库的execSQL (String sql)方法可以创建一个table(表)vpublic void execSQL(String sql)vexecSQL (String sql)方法的参数“sql“是SQL语句,为字符串类型。如例如:SQLiteDatabase db;

21、 String sql = CREATE TABLE pic (_id INTEGER PRIMARY KEY , filename VARCHAR(10), data TEXT); db.execSQL(sql); Sql 中最简单的创建表的方法Create table 表名(字段1 数据类型,字段2 数据类型,字段3 数据类型,字段4 数据类型)项目初始化的代码项目初始化的代码String cmd=create table user(id varchar(20) PRIMARY KEY,username varchar(20),password varchar(10);sld.execSQ

22、L(cmd);AlertDialog.Builder ald=new AlertDialog.Builder(MainActivity.this);ald.setTitle(提示);ald.setMessage(表创建成功);ald.setPositiveButton(确定, null);ald.show();向表中插入一条数据v 往数据库的table插入数据,可以直接调用db.insert()方法插入,但是insert()方法中的第三个参数是一个ContentValues的,其实也就是一个map,包含了一些键值对(key-value)。通过contentValues的put方法,可以把键值对

23、放进contentValues里面,然后再通过db.insert()方法插到数据库的table中。vpublic long insert(String table,String nullColumnHack, ContentValues values)vinsert的第一个参数是的第一个参数是table的名字,第二个参数一般为的名字,第二个参数一般为null,第三个参数是,第三个参数是contentValues。若成功。若成功insert,就返回新插入就返回新插入row的的id,不成功返回,不成功返回-1。vContentValues cv =new contentValues(); vcv.

24、put(“num”,1); vcv.put(“data”, 测试我的数据库); vdb.insert(table,null,cv); 项目中增加一条新记录的方法项目中增加一条新记录的方法public void onClick(View v) / TODO Auto-generated method stubString id=et1.getText().toString();String name=et2.getText().toString();String psw=et3.getText().toString();ContentValues cv=new ContentValues();c

25、v.put(id,id );cv.put(username, name);cv.put(password, psw);sld.insert(user, null, cv);AlertDialog.Builder ald=new AlertDialog.Builder(MainActivity.this);ald.setTitle(提示);ald.setMessage(数据添加成功);ald.setPositiveButton(确定, null);ald.show();查询查询vquery(String table, String columns, String whereClause, Str

26、ing selectionArgs, String groupBy, Sttring having, String orderBy, String limit) v table: 查询数据的表名 v columns: 要查询的列名v whereClause: 条件查询 v whereArgs:条件查询的参数 v groupBy: 控制分组 v having: 分组过滤 v orderBy: 排序 v limit: 进行分页 v Select * from mj ;v rawQuery(cmd,null)v Query(mj, new String“id”,”name”,”english? An

27、d maths?”,new String“98”,”78”,null,null,null,null)Cursor类v在在android中查询数据是通过中查询数据是通过cursor类来类来实现的,当我使用实现的,当我使用SQliteDatabase.query()方法时,会得方法时,会得到一个到一个Cursor对象,对象,Cursor指向的就是每指向的就是每一条数据一条数据Cursor对象的常用方法 vmove(int offset); /以当前位置为参考,移动到指定行 vmoveToFirst(); /移动到第一行 vmoveToLast(); /移动到最后一行 vmoveToPosition

28、(int position); /移动到指定行 vmoveToPrevious(); /移动到前一行 vmoveToNext(); /移动到下一行 visFirst(); /是否指向第一条 visLast(); /是否指向最后一条 visBeforeFirst(); /是否指向第一条之前 v isAfterLast(); /是否指向最后一条之后 visNull(int columnIndex); /指定列是否为空(列基数为0) visClosed(); /游标是否已关闭 vgetCount(); /总数据项数 vgetPosition(); /返回当前游标所指向的行数 vgetColumnIn

29、dex(String columnName);/返回某列名对应的列索引值 vgetString(int columnIndex); /返回当前行指定列的值 项目中查询按钮的代码项目中查询按钮的代码v Cursor cur=sd.query(banji1, null, null, null, null, null, null);v tv7.setText(本表共本表共+cur.getCount()+条记录,现在是第条记录,现在是第1条条记录记录);v cur.moveToFirst();v tv4.setText(cur.getString(0);v tv5.setText(cur.getStr

30、ing(1);v tv6.setText(cur.getString(2);v cur_count=1;案例中下一条按钮功能的实现案例中下一条按钮功能的实现v Cursor cur=sd.query(banji1, null, null, null, null, null, null);v if(cur_countcur.getCount()v cur_count+;v tv7.setText(本表共本表共+cur.getCount()+条记录,现在是第条记录,现在是第+cur_count+条记录条记录);v cur.move(cur_count);v tv4.setText(cur.getS

31、tring(0);v tv5.setText(cur.getString(1);v tv6.setText(cur.getString(2);v elsev AlertDialog.Builder ad=new AlertDialog.Builder(MainActivity.this);v ad.setTitle(提示提示);v ad.setMessage(已为最后一条记录了!已为最后一条记录了!);v ad.setPositiveButton(确定确定, null);v ad.show();v 更新表中的数据更新表中的数据v 直接调用数据库的db.update()方法。v public int update(String table,values,String whereClause,String whereArgs)v 第一个参数table名第二个参数更新条件,为字符串。第三个参数字符串数组,和whereClause配合使用。 用法一、如果whereClause的条件已经直接给出,如“name= “ + num,num是传入的参数。则whereArg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论