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

下载本文档

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

文档简介

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

sharedPreferences=getSharedPreferences("configuration",0);2)让sharedPreferences处于编辑状态SharedPreferences.Editor

editor

=

sharedPreferences.edit();3)存放数据editor.putString("name","harvey");4)完成提交mit();读取数据信息1)打开名为configuration的配置文件SharedPreferences

sharedPreferences=getSharedPreferences("configuration",0);2)获取数据Stringname=sharedPreferences.getString("name","默认值");获取SharedPreferences对象方法SharedPreferencespre=Context.getSharedPreferences(Stringname,intmode);注:name为本组件的配置文件名(如果想要与本应用程序的其他组件共享此配置文件,可以用这个名字来检索到这个配置文件,在这里要特别注意,因为在Android中已经确定了SharedPreferences是以xml形式保存,所以,在填写文件名参数时,不要给定“.xml”后缀,android会自动添加。只要直接写上文件名即可。它会直接被保存在/data/data/<packagename>/shared_prefs路径下,它是采用键值对的形式保存参数。当你需要获得某个参数值时,按照参数的键索引即可)。

SharedPreferences支持的三种访问模式(这三种模式可以由Activity调用:1、

MODE_PRIVATE:只有创建这个SharedPreferences的Activity与权限读写它。2、

MODE_WORLD_READABLE:

其他Activity对这个SharedPreferences具有可读权限。3、

MODE_WORLD_WRITEABLE:其他Activity对这个SharedPreferences也具有可读可写的权利练习第二节文件存储简介利用SharedPreferences只能保存简单的数据,要存储更多类型的数据,则需要使用文件的存储操作。对于文件的存储操作,在Android中有两种形式。1、直接利用Activity提供的文件操作方法。此类操作的所有文件路径只能是“\data\data\<pacagename>\files\文件名称”2、利用javaIO流执行操作。此类操作的文件可以是任意路径(包括sdcard)下,但是需要为其操作授权。File类简介在java中,File类既可以表示文件又可以表示目录,它提供了操作文件或目录的一组方法1:Filef=newFile("F:\\java\\rose");(其中F:\java\rose是一个已经存在的目录),你可以调用file.exists()看目录是否存在,如存在则函数返回true,如不存在你可以调用file.mkdir();创建rose目录。2:Filefile=new(f,“file1.txt”);可以实例化F:\java\rose目录下的文件file1.txt(文件已存在),你可以调用file.exists()看文件是否存在,如存在则函数返回true,如不存在你可以调用file.createNewFile()创建file1.txt文件。注意,当你实例化一个已经存在的文件时,一定要加上后缀名,如.txt等,否则实例化的文件是不存在的。调用file.exists()返回false.Environment类简介

Environment是一个提供访问环境变量的类。Environment常用方法:

01.方法:getDataDirectory()02.解释:返回File,获取Android数据目录。03.方法:getDownloadCacheDirectory()04.解释:返回File,获取Android下载/缓存内容目录。

05.方法:getExternalStorageDirectory()06.解释:返回File,获取外部存储目录即SDCard07.方法:getExternalStoragePublicDirectory(Stringtype)08.解释:返回File,取一个高端的公用的外部存储器目录来摆放某些类型的文件09.方法:getExternalStorageState()10.解释:返回File,获取外部存储设备的当前状态11.方法:getRootDirectory()12.解释:返回File,获取Android的根目录文件字节输入/输出流文件字节输入/输出流是指FileInputStream和FileOutputStream类,它们实现了对文件的顺序访问,并以字节为单位进行读/写操作FileOutputStream用于将字节数据写出到文件。继承自OutputStream类构造方法摘要FileOutputStream(Filefile)

创建一个向指定File对象表示的文件中写入数据的文件输出流。FileOutputStream(Filefile,booleanappend)

创建一个向指定File对象表示的文件中写入数据的文件输出流。FileOutputStream(FileDescriptorfdObj)

创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。FileOutputStream(Stringname)

创建一个向具有指定名称的文件中写入数据的输出文件流。FileOutputStream(Stringname,booleanappend)

创建一个向具有指定name的文件中写入数据的输出文件流。常用方法Close():关闭缓冲输出流并释放与此流有关的所有系统资源。Write(intb):

将指定的字节写入此缓冲输出流Write(byte[]b):将b.length个字节写入此缓冲输出流。案例Filefile=newfile(“d:\test.txt");FileOutputStreamfos=newFileOutputStream(file);Stringx=“iamok”Fos.write(x.getbytes())Fos.closeFileInputStream一、构造方法FileInputStream(Stringname);//使用给定的文件名创建对象FileInputStream(Filefile);//使用File对象创建FileInputStream对象二、读取文件1.使用文件输入流读取文件FileInuputStreamistream=newileInputStream("myfile.dat");或:Filef=newFile("myfile.dat");FileInputStreamistream=newFileInputStream(f);构造方法可能会产生异常IOException,故为了把一个文件输入流对象与一个文件关联起来,需:try{FileInputStreamins=newFileInputStream("myfile.dat");}catch(IOExceptione){System.out.println("Filereaderror:"+e);}2.从输入流中读取字节intread();//从输入流中读取单个字节数据(0~255),如到输入流末尾则返回-1intread(byteb[]);//读多个字节intread(byteb[],intoff,intlen);3.关闭流Java在程序结束时自动关闭所有打开的流,但显式关闭任何打开的流是一个好习惯。close();FileInputStream使用案例FileInputStreamf=FileInputStream("/home/software....../root/ends,jsp");

BufferedInputStreambu=newBufferedInputStream(f);

bytea[]=newbyte[10];

intn;

while((n=bu.read(a))!=-1)

{Strings=newString(a,o,n)

out.println(s);

}

f.close();

bu.close();

read返回的是一个整型的数,当到文件的尾时候返回-1,也就是说read一次读取的字节数为字节数组的长度。SQLite简单介绍

SQ为StructuredQuery(结构化查询)的缩写,Lite表示轻量级。SQLite是一款开源的关系型数据库。几乎可以支持所有现代编程语言和各种操作系统对SQLite数据库的操作一般包括:创建一个数据库,打开数据库,关闭数据库,删除数据库。创建和打开数据库的方法:

使用openOrCreateDatabase()方法来创建,若数据库不存在,则会创建新数据库,若存在,则打开数据库。

openOrCreateDatabase()方法的返回值为一个SQLiteDatabase对象

openOrCreateDatabase()方法的官方说明public

SQLiteDatabase

openOrCreateDatabase

(String

name,intmode,

SQLiteDatabase.CursorFactoryfactory)第一个参数————为数据库的名字,string类型。第二个参数————为常量,如下所示

常量

含义

MODE_PRIVATE

默认模式,值为0,文件只可以被调用该方法的应用程序访问MODE_WORLD_READABLE

所有的应用程序都具有对该文件读的权限。MODE_WORLD_WRITEABLE

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

)“表”的操作方法

首先要明确一点的是,一个数据库可以有很多表,一个表中包含很多条数据,也就是说,在数据库里面保存数据其实是保存在Table

(表)里面的。对已经存在和已经创建的数据库操作一般包括:创建表,往表添加数据,从表中删除数据,修改表中的数据,查询表中的数据,删除已存在的表。

创建一个表通过调用数据库的execSQL

(String

sql)方法可以创建一个table(表)publicvoid

execSQL(String

sql)execSQL

(String

sql)方法的参数“sql“是SQL语句,为字符串类型。如例如:SQLiteDatabase

db;

String

sql

=

"CREATE

TABLE

pic

(_id

INTEGER

PRIMARY

KEY

,

filename

VARCHAR(10),

data

TEXT)";

db.execSQL(sql);

Sql中最简单的创建表的方法Createtable表名(字段1数据类型,字段2数据类型,字段3数据类型,字段4数据类型)项目初始化的代码Stringcmd="createtableuser(idvarchar(20)PRIMARYKEY,usernamevarchar(20),passwordvarchar(10))";sld.execSQL(cmd);AlertDialog.Builderald=newAlertDialog.Builder(MainActivity.this);ald.setTitle("提示");ald.setMessage("表创建成功");ald.setPositiveButton("确定",null);ald.show();向表中插入一条数据

往数据库的table插入数据,可以直接调用db.insert()方法插入,但是insert()方法中的第三个参数是一个ContentValues的,其实也就是一个map,包含了一些键值对(key-value)。通过contentValues的put方法,可以把键值对放进contentValues里面,然后再通过db.insert()方法插到数据库的table中。publiclong

insert(String

table,String

nullColumnHack,

ContentValues

values)insert的第一个参数是table的名字,第二个参数一般为null,第三个参数是contentValues。若成功insert,就返回新插入row的id,不成功返回-1。ContentValues

cv

=new

contentValues();

cv.put(“num”,1);

cv.put(“data”,"

测试我的数据库");

db.insert(table,null,cv);

项目中增加一条新记录的方法publicvoidonClick(Viewv){//TODOAuto-generatedmethodstubStringid=et1.getText().toString();Stringname=et2.getText().toString();Stringpsw=et3.getText().toString();ContentValuescv=newContentValues();cv.put("id",id);cv.put("username",name);cv.put("password",psw);sld.insert("user",null,cv);AlertDialog.Builderald=newAlertDialog.Builder(MainActivity.this);ald.setTitle("提示");ald.setMessage("数据添加成功");ald.setPositiveButton("确定",null);ald.show();查询query(Stringtable,String[]columns,StringwhereClause,String[]selectionArgs,StringgroupBy,Sttringhaving,StringorderBy,Stringlimit)

table:查询数据的表名columns:要查询的列名whereClause:条件查询whereArgs:条件查询的参数groupBy:控制分组having:分组过滤orderBy:排序limit:进行分页

Select*frommj;rawQuery(cmd,null)Query(mj,newString[]{“id”,”name”},”english>?Andmaths>?”,newString[]{“98”,”78”},null,null,null,null)Cursor类在android中查询数据是通过cursor类来实现的,当我使用SQliteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据Cursor对象的常用方法

move(int

offset);

//以当前位置为参考,移动到指定行

moveToFirst();

//移动到第一行

moveToLast();

//移动到最后一行

moveToPosition(int

position);

//移动到指定行

moveToPrevious();

//移动到前一行

moveToNext();

//移动到下一行

isFirst();

//是否指向第一条

isLast();

//是否指向最后一条

isBeforeFirst();

//是否指向第一条之前

isAfterLast();

//是否指向最后一条之后

isNull(int

columnIndex);

//指定列是否为空(列基数为0)

isClosed();

//游标是否已关闭

getCount();

//总数据项数

getPosition();

//返回当前游标所指向的行数

getColumnIndex(String

columnName);//返回某列名对应的列索引值

getString(int

columnIndex);

//返回当前行指定列的值

项目中查询按钮的代码Cursorcur=sd.query("banji1",null,null,null,null,null,null);tv7.setText("本表共"+cur.getCount()+"条记录,现在是第1条记录");cur.moveToFirst();tv4.setText(cur.getString(0));tv5.setText(cur.getString(1));tv6.setText(cur.getString(2));cur_count=1;案例中下一条按钮功能的实现Cursorcur=sd.query("banji1",null,null,null,null,null,null);if(cur_count<cur.getCount()){cur_count++;tv7.setText("本表共"+cur.getCount()+"条记录,现在是第"+cur_count+"条记录");cur.move(cur_count);tv4.setText(cur.getString(0));tv5.setText(cur.getString(1));tv6.setText(cur.getString(2));}else{AlertDialog.Builderad=newAlertDialog.Builder(MainActivity.this);ad.setTitle("提示");ad.setMessage("已为最后一条记录了!");ad.setPositiveButton("确定",null);ad.show();}更新表中的数据直接调用数据库的db.update()方法。publicintupdate(String

table,values,String

whereClause,String[]

whereArgs)第一个参数————table名

第二个参数————更新条件,为字符串。第三个参数————字符串数组,和whereClause配合使用。

用法一、如果whereClause的条件已经直接给出,如“name=“+num,num是传入的参数。则whereArgs可设为null。

用法二、当在whereClause中包含”?”时,则whereArgs这个数组中的值将依次替换whereClause中出现的”?”ContentValuescv=newContentValues();cv.put("name",et2.getText().toString());cv.put("english",et3.getT

温馨提示

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

最新文档

评论

0/150

提交评论