Android数据存储与访问Word文件下载.docx

上传人:b****3 文档编号:17894191 上传时间:2022-12-11 格式:DOCX 页数:17 大小:31.35KB
下载 相关 举报
Android数据存储与访问Word文件下载.docx_第1页
第1页 / 共17页
Android数据存储与访问Word文件下载.docx_第2页
第2页 / 共17页
Android数据存储与访问Word文件下载.docx_第3页
第3页 / 共17页
Android数据存储与访问Word文件下载.docx_第4页
第4页 / 共17页
Android数据存储与访问Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

Android数据存储与访问Word文件下载.docx

《Android数据存储与访问Word文件下载.docx》由会员分享,可在线阅读,更多相关《Android数据存储与访问Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

Android数据存储与访问Word文件下载.docx

/files目录,如:

/data/data/cn.itcast.action/files/itcast.txt,通过点击Eclipse菜单“Window”-“ShowView”-“Other”,在对话窗口中展开android文件夹,选择下面的FileExplorer视图,然后在FileExplorer视图中展开/data/data/<

/files目录就可以看到该文件。

openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:

Context.MODE_PRIVATE=0

Context.MODE_APPEND=32768

Context.MODE_WORLD_READABLE=1

Context.MODE_WORLD_WRITEABLE=2

Context.MODE_PRIVATE:

为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。

可以使用Context.MODE_APPEND

Context.MODE_APPEND:

模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:

表示当前文件可以被其他应用读取;

MODE_WORLD_WRITEABLE:

表示当前文件可以被其他应用写入。

如果希望文件被其他应用读和写,可以传入:

openFileOutput("

Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。

默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<

/files),其他程序无法访问。

除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE,只有这样其他程序才能正确访问。

读取文件内容

如果要打开存放在/data/data/<

/files目录应用私有的文件,可以使用Activity提供openFileInput()方法。

FileInputStreaminStream=this.getContext().openFileInput("

);

Log.i("

FileTest"

readInStream(inStream));

readInStream()的方法请看本页下面备注。

或者直接使用文件的绝对路径:

Filefile=newFile("

/data/data/cn.itcast.action/files/itcast.txt"

FileInputStreaminStream=newFileInputStream(file);

注意:

上面文件路径中的“cn.itcast.action”为应用所在包,当你在编写代码时应替换为你自己应用使用的包。

对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

Activity还提供了getCacheDir()和getFilesDir()方法:

getCacheDir()方法用于获取/data/data/<

/cache目录

getFilesDir()方法用于获取/data/data/<

/files目录

把文件存放到SDCard

使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。

对于像视频这样的大文件,我们可以把它存放在SDCard。

SDCard是干什么的?

你可以把它看作是移动硬盘或U盘。

在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。

创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:

在Dos窗口中进入androidSDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img:

mksdcard2048MD:

\AndroidTool\sdcard.img

在程序中访问SDCard,你需要申请访问SDCard的权限。

在AndroidManifest.xml中加入访问SDCard的权限如下:

<

!

--在SDCard中创建与删除文件权限-->

uses-permissionandroid:

name="

android.permission.MOUNT_UNMOUNT_FILESYSTEMS"

/>

--往SDCard写入数据权限-->

android.permission.WRITE_EXTERNAL_STORAGE"

要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。

访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

FilesdCardDir=Environment.getExternalStorageDirectory();

//获取SDCard目录

FilesaveFile=newFile(sdCardDir,“itcast.txt”);

FileOutputStreamoutStream=newFileOutputStream(saveFile);

outStream.write("

Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。

Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:

FilesdCardDir=newFile("

/sdcard"

//获取SDCard目录

FilesaveFile=newFile(sdCardDir,"

//上面两句代码可以合成一句:

FilesaveFile=newFile("

/sdcard/itcast.txt"

传智播客test"

使用SharedPreferences进行数据存储

很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。

对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件进行保存。

如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?

Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。

使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<

/shared_prefs目录下:

SharedPreferencessharedPreferences=getSharedPreferences("

itcast"

Editoreditor=sharedPreferences.edit();

//获取编辑器

editor.putString("

name"

"

editor.putInt("

age"

4);

mit();

//提交修改

生成的itcast.xml文件内容如下:

?

xmlversion='

1.0'

encoding='

utf-8'

standalone='

yes'

?

>

map>

stringname="

传智播客<

/string>

intname="

value="

4"

/>

/map>

因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。

方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。

如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。

访问SharedPreferences中的数据

访问SharedPreferences中的数据代码如下:

//getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值

Stringname=sharedPreferences.getString("

"

intage=sharedPreferences.getInt("

1);

如果访问其他应用中的Preference,前提条件是:

该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。

如:

有个<

为cn.itcast.action的应用使用下面语句创建了preference。

getSharedPreferences("

Context.MODE_WORLD_READABLE);

其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context访问preference,访问preference时会在应用所在包下的shared_prefs目录找到preference:

ContextotherAppsContext=createPackageContext("

cn.itcast.action"

Context.CONTEXT_IGNORE_SECURITY);

SharedPreferencessharedPreferences=otherAppsContext.getSharedPreferences("

0);

如果不通过创建Context访问其他应用的preference,可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:

FilexmlFile=newFile(“/data/data/<

/shared_prefs/itcast.xml”);

//<

应替换成应用的包名

使用SQLite数据库存储数据

在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。

SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。

例如:

可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。

但有一种情况例外:

定义为INTEGERPRIMARYKEY的字段只能存储64位整数,当向这种字段中保存除整数以外的数据时,将会产生错误。

另外,SQLite在解析CREATETABLE语句时,会忽略CREATETABLE语句中跟在字段名后面的数据类型信息,如下面语句会忽略name字段的类型信息:

CREATETABLEperson(personidintegerprimarykeyautoincrement,namevarchar(20))

SQLite可以解析大部分标准SQL语句,如:

查询语句:

select*from表名where条件子句groupby分组字句having...orderby排序子句

select*fromperson

select*frompersonorderbyiddesc

selectnamefrompersongroupbynamehavingcount(*)>

1

分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录

select*fromAccountlimit5offset3或者select*fromAccountlimit3,5

插入语句:

insertinto表名(字段列表)values(值列表)。

insertintoperson(name,age)values(‘传智’,3)

更新语句:

update表名set字段名=值where条件子句。

updatepersonsetname=‘传智‘whereid=10

删除语句:

deletefrom表名where条件子句。

deletefrompersonwhereid=10

使用SQLiteDatabase操作SQLite数据库

Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。

对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。

execSQL()方法可以执行insert、delete、update和CREATETABLE之类有更改行为的SQL语句;

rawQuery()方法可以执行select语句。

execSQL()方法的使用例子:

SQLiteDatabasedb=....;

db.execSQL("

insertintoperson(name,age)values('

传智播客'

4)"

db.close();

执行上面SQL语句会往person表中添加进一条记录,在实际应用中,语句中的“传智播客”这些参数值应该由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句,当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。

要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。

有些时候用户往往还会输入像“&

”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。

SQLiteDatabase类提供了一个重载后的execSQL(Stringsql,Object[]bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?

)。

使用例子如下:

insertintoperson(name,age)values(?

?

)"

newObject[]{"

4});

execSQL(Stringsql,Object[]bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。

SQLiteDatabase的rawQuery()用于执行select语句,使用例子如下:

SQLiteDatabasedb=....;

Cursorcursor=db.rawQuery(“select*fromperson”,null);

while(cursor.moveToNext()){

intpersonid=cursor.getInt(0);

//获取第一列的值,第一列的索引从0开始

Stringname=cursor.getString

(1);

//获取第二列的值

intage=cursor.getInt

(2);

//获取第三列的值

cursor.close();

rawQuery()方法的第一个参数为select语句;

第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。

带占位符参数的select语句使用例子如下:

Cursorcursor=db.rawQuery("

select*frompersonwherenamelike?

andage=?

newString[]{"

%传智%"

});

Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc,其实Cursor与JDBC中的ResultSet作用很相似。

使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。

另外Cursor还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true)、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true)和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true)。

除了前面给大家介绍的execSQL()和rawQuery()方法,SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法:

insert()、delete()、update()和query()。

这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作。

Insert()方法用于添加数据,各个字段的数据使用ContentValues进行存放。

ContentValues类似于MAP,相对于MAP,它提供了存取数据对应的put(Stringkey,Xxxvalue)和getAsXxx(Stringkey)方法,key为字段名称,value为字段值,Xxx指的是各种常用的数据类型,如:

String、Integer等。

SQLiteDatabasedb=databaseHelper.getWritableDatabase();

ContentValuesvalues=newContentValues();

values.put("

longrowid=db.insert(“person”,null,values);

//返回新添记录的行号,与主键id无关

不管第三个参数是否包含数据,执行Insert()方法必然会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他字段值为Null的记录。

Insert()方法内部实际上通过构造insert语句完成数据的添加,Insert()方法的第二个参数用于指定空值字段的名称,相信大家对此参数会感到疑

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1