Android学习笔记(十四)
Android中的数据存储
数据持久化就是指那些内存中的瞬时数据保存到存储设备中。Android系统中主要提供了三种方式用于简单地实现
数据持久功能,即文件存储、SharedPreferences存储和数据库存储。
1.文件存储是Android中一种基本的存储方式,它不对存储的内容进行任何的格式化处理,所有的数据是原封不动的
保存到文件中。
1.1
Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件。
这个方法接收两个参数:
1.第一个参数是文件名,(文件名中不可以包含路径,所有的文件都是默认保存在/data/data/<package name>/files/目录下)。
2.第二个参数是文件的操作模式,(主要有两种操作模式可选:1.MODE_PRIVATE和MODE_APPEND,其中
MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容;
MODE_APPEND表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。)
openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象后就可以使用Java流的方式将数据写在文件中了。
下面的代码,展示了如何把一段文本内容写在文件中:
public void save (String inputText) {
String data = "Data to Save";
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (writer != null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述的代码中,通过openFileOutput()方法能够得到一个FileOutputStream对象,然后在借助它构建出一个
OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,这样就可以通过
BufferedWriter来将文本内容写入到文件中了。
1.2
Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。
这个方法只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下
去加载这个文件,并返回一个FileInputStream对象,得到这个对象后通过java流的方式可以将数据读取出来了。
下面是代码示例,展示如何从文件中读取文本数据:
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
上述的代码中,首先通过openFileInput()方法获取得到一个FileInputStream对象,然后借助它构建出一个InputStreamReader对象,
接着再使用InputStreamReader构建出一个BufferedReader对象,这样就可以使用BufferedReader进行一行行地读取,把文件
中的内容全部读取出来并存在在一个StringBuilder对象中,最后将读取的内容返回即可。
2.SharedPreferences是使用键值对的方式来存储数据的。
2.1
要用sharedPreferences来存储数据,首先需要获取到SharedPreferences对象。Android中主要提供了三种方法用于
得到SharedPreferences对象。
1).Context类中的getSharedPreferences()方法
该方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称,如果指定的文件名称不存在则会创建一个,
SharedPreferences文件都是存在/data/data/<package name>/shared_prefs/目录下的;
第二个参数用于指定操作模式,主要有两种模式可以选择,MODE_PRIVATE和MODE_MULTI_PROCESS。
其中MODE_PRIVATE是默认的操作模式,表示只有当前的应用程序才可以对这个sharedPreferences文件进行读写。
MODE_MULTI_PROCESS一般用于对个进程中对同一个SharedPreferences文件进行读写的情况。
2).Activity类中的getPreferences()方法
3).preferenceManager类中的getDefaultSharedPreferences()方法
得到了SharedPreferences对象之后,就可以向文件中存储数据了,主要可以分为三部实现:
1).调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
2).向SharedPreferences.Editor对象中添加数据。比如添加一个字符串就用putString()方法.
3).调用commit()方法将添加的数据提交.
具体实现如下面的代码所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/save_data"/>
</LinearLayout>
设置一个按钮,用于存储数据到文件中。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveData = (Button) findViewById(R.id.save_data);
//对saveData设置监听器
saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
//Context类中的getSharedPreferences()方法来获取SharedPreferences对象,该方法接收两个参数
//1.第一个参数用于指定SharedPreferences文件的名称,如果指定的文件不存在,则会创建一个。
//2.第二个参数用于指定操作模式,主要有两种操作模式可选(MODE_PRIVATE和MODE_MULTI_PROCESS)
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
//向SharedPreferences.Editor对象中添加数据。比如添加一个字符串就用putString()方法
editor.putString("name","Tom");
editor.putInt("age",22);
//调用commit()方法将添加的数据提交
editor.commit();
}
});
上述的代码中,点击按钮通过getSharedPreferences()方法得到SharedPreferences的文件名为data,并得到了
SharedPreferences.Editor的对象。接着添加数据,最后调用commit() 方法进行提交。
2.2
从SharedPreferences中读取数据
SharedPreferences对象中提供了一系列的get方法用于对存储的数据进行读取,每种get方法都对应了
SharePreferences.Editor中的一种put方法。
具体的实现如下面的代码所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/save_data"/>
<Button
android:id="@+id/restore_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/restore_data"/>
</LinearLayout>
修改MainActivity中的代码,如下图所示:
restoreData = (Button) findViewById(R.id.restore_data);
//对restoreData按钮设置监听器
restoreData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过getSharedPreferences()方法得到SharedPreferences的对象
SharedPreferences sharedPre = getSharedPreferences("data", MODE_PRIVATE);
//通过get方法得到数据
String name = sharedPre.getString("name","");
int age = sharedPre.getInt("age", 0);
Log.d("MainActivity","name is " + name);
Log.d("MainActivity","age is " + age);
}
});
上述的代码中,首先通过getSharedPreferences()方法得到了SharedPreferences对象,然后调用get方法获取数据,
如果没有找到相应的值就会使用方法中传入的默认值来代替。
Android学习笔记(十四)的更多相关文章
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】Pro Android学习笔记(四):了解Android资源(下)
处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...
- Android学习笔记(四)——再探Intent
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 我们可以使用 Intent 来启动一个活动, 还可以在启动活动的时候传递数据的,下面一起来看一下: 一.向下一 ...
- (C/C++学习笔记) 十四. 动态分配
十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...
- Android学习笔记_3_四种布局
Android布局是应用界面开发的重要一环,在Android中,共有四种布局方式, 分别是:FrameLayout( 帧布局 ).LinearLayout (线性布局).TableLayout(表格布 ...
- 【转】 Pro Android学习笔记(四八):ActionBar(1):Home图标区
目录(?)[-] Home Icon 源代码 TextView的滚动 返回主activity或指定activity ActionBar在Android 3.0 SDK中为平板引入,在4.0中也 ...
- 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考
目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...
- 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器
目录(?)[-] Transaction的一些操作 再谈FragmentManager 调用其他fragment的方法 唤起activity 唤起fragment和相互通信 一些其它 Transact ...
随机推荐
- react native 常用第三方库
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 } p.p2 { margin: 0.0p ...
- Linux学习之路—磁盘分区
1.各硬件设备在Linux中的文件名 在Linux系统中,每个设备都被当做一个文件来对待,同时在Linux系统中,几乎所有的硬件设备文件都在/dev这个目录中. 设备 设备在Linux内的文件名 ID ...
- linux sed的使用
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理, 可以将数据行进行替换.删除.新增.选取等特定工作. sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同:同时 ...
- C#学习手册
考研学子为何放弃考研?C++开发ArcGis为何无疾而终?C#为何又成为新宠?这一切得一切是人性的扭曲还是道德的败坏,敬请收看接下来的C#学习手册.ps:一天一更.拖更打死.
- CCI4.4/LintCode Balanced Binary Tree, Binary Tree, Binary Search Tree
Binary Tree: 0到2个子节点; Binary Search Tree: 所有左边的子节点 < node自身 < 所有右边的子节点: 1. Full类型: 除最下面一层外, 每一 ...
- system占用80端口的问题
80端口被占用的问题 首先可以看看是不是iis占用了.如果是的话.修改为其他端口即可. 如果不是.. 在cmd中输入命令netstat -ano 查看是不是system占用了80端口? 如果是syst ...
- Android驱动开发前的准备(四)
源代码的下载和编译 4.1 下载.编译和测试Android源代码 4.2下载和编译linux内核源代码 4.1.1 配置Android源代码下载环境 (1) 创建一个用于存放下载脚本文件的目录 # m ...
- Office word 2013中直接调用MathType的方法
Office word 2013中直接调用MathType的方法 | 浏览:4403 | 更新:2014-02-20 14:45 | 标签: word 使用Office word 2013的用户肯定早 ...
- php操作Memcache
一.memcache基本的介绍 是一个高性能的分布式内存对象缓存系统. 和mysql比较,进行理解memcache (1)该软件是一个c/s架构, (2)mysql的数据是存储到哪里的?是存储到磁盘里 ...
- MyEclipse黑色主题
第一步:打开链接http://www.eclipsecolorthemes.org/选中一款:下载其中的epf格式. 如图: 在eclipse中打开:file > import > Gen ...