文档章节

安卓开发--数据存储

shadowalker1990
 shadowalker1990
发布于 2013/08/31 21:46
字数 933
阅读 418
收藏 14

在安卓中有三种数据存储方式,一种是使用SharedPreferences,用于存储一些简单的值,就好比游戏中的分数排行榜,就可以使用此来存储;第二种是使用File存储,使用方法和JAVA PC类似,至少思想一致,同时安卓使用的是linux的文件系统,如果熟悉linux的则使用起来更方便;第三种是使用数据库,安卓使用SQLite来作为数据库存储。本文主要讲前两种方法,第三种数据使用会后面单独列一章出来,因为这部分的实验我还没做完,所以还不能详细的写。

一.SharedPreferences

其使用key-value格式保存数据,如果有简单的数据,就可以用它来保存。一个大致的使用步骤如下:

1.在string.xml中声明文件名,变量值,即key内容。我的string.xml中的一段代码如下:
   <string name="preferences_file_key">preferences_file</string>
    <string name="high_scores">high_scores</string>
    <string name="high_scores_default">default_high_scores</string>

2.声明完这些就可以在activity中使用getSharedPreferences()等函数来使用这种存储方式了。
代码如下:

main.activity:
int newScores = 2000;
int defScores = 10000;
SharedPreferences sharedPreferences = getSharedPreferences(getString(R.string.preferences_file_key),Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(getString(R.string.high_scores_default),defScores);
editor.putInt(getString(R.string.high_scores),newScores);
editor.commit();

display.activity:
SharedPreferences sharedPreferences = getSharedPreferences(getString(R.string.preferences_file_key),Context.MODE_PRIVATE);
long high_scores = sharedPreferences.getInt(getString(R.string.high_scores),R.string.high_scores_default);

二.使用内置存储卡或者外置存储卡来保存数据:

使用过安卓的人都知道安卓有内置存储空间与外置存储空间,也即internal storage和external storage。两者的区别主要在于Internal随时可得,因为你无法卸载一个内置存储空间;第二个是其仅对你的app适用;第三个是当你卸载你的app时,所有文件都会被删除。external的区别主要在于,它不是随时可得的,因为你可能会unmount一个sdcard;第二个是它对所有app都是可见的;第三个是当你卸载app时,某些文件可能被一同删除,但是一些就可能被保留。

另外对于文件的读写操作与java.io是一致的,所以如果你熟悉java.io,那么使用安卓的文件就非常容易了。

1.下面是一个使用internal的示例:

String fileName = "myFile";
File myFile = new File(getFilesDir(),fileName);
myFile.mkdir();

String message = "this is my first android file";
FileOutputStream fileOutputStream;
FileInputStream fileInputStream;

try{
    fileOutputStream = myFile.openFileOutput(fileName,Context.MODE_PRIVATE);
    myFile.write(message.getBytes());
    myFile.close();

    fileInputStream = myFile.openFileInput(fileName);
    byte[] string = new byte[50];
    fileInputStream.read(string);
    System.out.println(new String(string));
}catch(IOException e){
    e.printStackTrace();
}

还有一个安卓文件的函数叫getCacheDir(),从名字就可以看出,其多半用于建立临时文件,或者缓存只用。一个示例如下:

try{
    File file = File.createTempFile(fileName,null,getCacheDir());
}catch(IOException e){
    e.printStackTrace();
}

当启动app后,就可以在logcat里面看到显示的这段文字。

2.使用external:

使用external之前,需要在Manifest中声明权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){
    File file= new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"my_1");
    if(!file.mkdir()){Log.e(LOG_TAG1,"can't create directory1");}
}

if(Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) ){
    File file = new File(getExternalFilesDir(Environment.DIRECTORY_MUSICE),"my_2");
    if(!file.mkdir()){Log.e(LOG_TAG2,"can't create directory2");}
}

getExternalStorageState():这个函数用于返回当前sdcard的状态,是否可操作

getExternalStoragePublicDirectory():这个函数用于返回代表当前目录的一个目录句柄,同时使用这个函数创建的文件是被所有app都可见的,同时app卸载后该文件将会被保留。

getExternalFilesDir():这些文件也是均可得的,但是需要知道文件的目录及名字才行,同时卸载app后这些文件也会被一并卸载。

三.getFreeSpace()可以返回当前可得的空闲空间,但是并不代表写请求就会被满足,这得取决于系统当前状态。fileName.delete()用于删除创建的文件。

© 著作权归作者所有

shadowalker1990
粉丝 12
博文 25
码字总数 10508
作品 0
南京
程序员
私信 提问
Android:手把手教你学会使用Google出品的序列化神器Protocol Buffer

前言 习惯用 数据存储格式的你们,相信大多都没听过 其实 是 出品的一种轻量 & 高效的结构化数据存储格式,性能比 真的强!太!多! 由于 出品,我相信已经具备足够的吸引力 今天,我将详细介...

Carson_Ho
2018/04/16
0
0
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 Android 网络编程2 Okhttp缓存机制 Android 网络编程3 Java NIO to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图...

香沙小熊
2018/06/21
0
0
Android必备:Activity 活动 和 Intent 意图 的学习整理

看这里:Android必备:Activity 活动 和 Intent 意图 的学习整理 在Android必备:Android UI控件的了解与学习中,对AndroidUI做了初步的了解和学习,本篇继续进行Android开发学习的整理。And...

Realfighter
2015/03/04
455
0
开源中国2010年图书赠送活动《Android应用开发揭秘》

活动内容: 参与活动者请从现在开始,到2010年3月1日这段时间内,对Oschina独家发布的《Android应用开发揭秘》一书内容章节进行客观点评,及大家可以就该技术的趋势和定位提出一些看法,只要...

红薯
2010/01/25
6K
203
android求职

尹盼 基本信息 性别: 女 出生日期: 1989-10-30 目前所在地: 北京 大兴 电话: 15901440917 电子邮件: 953768578@qq.com QQ: 953768578 求职意向 工作性质: 全职 职位类别: 手机应用开...

蜡笔小溪2
2013/07/27
604
6

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
43分钟前
3
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
4
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部