用SharedPreference或文件的方式存储数据
一、用SharedPreference存储数据
当程序有少量的数据需要保存,而这些数据的格式比较简单(例如一些配置信息),这个时候就可以
使用SharedPreference来进行保存
下面例子将演示向SharedPreference中写入数据与读取数据
界面比较简单,是两个按钮,将用作写入数据,以及读取数据
<?xml version="1.0" encoding="utf-8"?>
<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/write"
android:text="写入数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/read"
android:text="读取数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Java代码如下
public class MainActivity extends AppCompatActivity {
SharedPreferences preferences;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//下面括号里的两个参数,第一个是储存文件的名称,第二个是文件储存模式,
//这里是表示私有文件,只能被本应用程序读写
preferences = getSharedPreferences("crazyit", MODE_PRIVATE);
//SharedPreference本身没有提供写入数据的能力,而是使用SharedPreference的内部接口
// 调用edit()方法获取它所对应的Editor对象
editor = preferences.edit();
Button read = (Button) findViewById(R.id.read);
Button write = (Button) findViewById(R.id.write);
//设置读取数据的监听事件
read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//读取time与random数据,如果数据不存在则返回默认值
String time = preferences.getString("time", null);
int randNum = preferences.getInt("random", 0);
//通过result这个变量得到上次的数据
String result = time == null ? "您暂时还未写入数据"
: "写入时间为:" + time + "\n上次生成的随机数为:" + randNum;
//通过Toast显示上次传入的数据
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
});
//设置写入数据的监听事件
write.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"+ "hh:mm:ss");
//用Editor提供的方法向SharedPreference写入数据time,值为当时的时间
editor.putString("time", sdf.format(new Date()));
//用Editor提供的方法向SharedPreference写入数据randow,值为一个随机数
editor.putInt("randow", (int) (Math.random()*1000));
//用Editor编辑完成后,用commit方法提交
editor.commit();
}
});
}
}
如果想要查看创建的文件,则可以使用Android Device Monitor查看
文件的地址为/data/data/<package name>/shared_prefs下。可以看到
SharedPreference数据总是以XML格式保存。
顺便一提,如果手机没有root的话,在Android Device Monitor中点击data文件夹会无法展开
下面再来看一个实例,这个实例可以记录应用程序的使用次数
Java代码如下
public class MainActivity extends AppCompatActivity {
SharedPreferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferences = getSharedPreferences("count" , MODE_PRIVATE);
int count = preferences.getInt("count", 0);
Toast.makeText(this, "程序以前被使用了" + count + "次", Toast.LENGTH_SHORT).show();
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("count", ++count);
editor.commit();
}
}
可以看到每次启动程序(onCreate),就让变量count自加,然后通过putInt方法存入并且通过commit方法提交
这样每次打开程序就能知道程序之前打开过多少次。
二、用FIle存储数据
Android同样支持Java的输入输出流,下面的实例将用IO流访问文件内容
布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<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/write"
android:text="写入数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edit1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/read"
android:text="读取数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edit2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Java代码如下
public class MainActivity extends AppCompatActivity {
final String FILE_NAME = "crazyit.bin";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println(new StringBuilder("a").append("b").append("c")
.toString());
Button read = (Button) findViewById(R.id.read);
Button write = (Button) findViewById(R.id.write);
final EditText edit1 = (EditText) findViewById(R.id.edit1);
final EditText edit2 = (EditText) findViewById(R.id.edit2);
write.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//将edit1里的内容写入文件中
write(edit1.getText().toString());
edit1.setText("");
}
});
read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//读取文件中的内容,显示在edit2上
edit2.setText(read());
}
});
}
private String read() {
try{
//打开文件输入流
FileInputStream fis = openFileInput(FILE_NAME);
byte[] buff = new byte[1024];
int hasRead = 0;
StringBuilder sb = new StringBuilder("");
//读取文件内容
while((hasRead = fis.read(buff))>0)
{
sb.append(new String(buff, 0,hasRead));
}
//关闭文件输入流
fis.close();
return sb.toString();
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
private void write(String content) {
try{
//打开文件输出流
FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
PrintStream ps =new PrintStream(fos);
//输出文件内容
ps.print(content);
//关闭文件输出流
ps.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
在这个程序中,在edit1中输入内容并点击write按钮,内容将会被写进文件中,
然后再点击read按钮,内容会显示在edit2上。
使用Android Device Monitor可以看到文件储存在/data/data/<package name>/files目录下。
用SharedPreference或文件的方式存储数据的更多相关文章
- 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)
https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
- Android提供了5种方式存储数据:
--使用SharedPreferences存储数据: --文件存储数据: --SQLite数据库存储数据: --使用ContentProvider存储数据: --网络存储数据: 一:使用SharedP ...
- 搭建zipkin并以mysql的方式存储数据
zipkin以mysql的方式存储 (centos+java8+mysql+zipkin2.3.1) 前言: 这篇教程用于搭建已mysql作为存储的zipkin.(还不知道zipkin是什么的小伙伴请 ...
- data-*属性——使用自定义属性的方式存储数据
HTML5提供了data-*属性能存储页面或应用程序的私有自定义数据.只需在属性前加上data-前缀即可,值可以是任意字符串. 存储的(自定义)数据能够被页面的 JavaScript 中利用,以创建更 ...
- 为什么很多 Android 程序喜欢在存储卡根目录建文件夹来存储数据而不是 Android/data 目录下?
知乎回答. http://www.zhihu.com/question/19866689 pansz,欢迎评论 知乎用户.弓长.知乎用户 赞同 这个道理很简单:因为没人管啊.你乱存放文件,在a ...
- sharedPreferences存储数据
sharedPreferences使用的是键值对的方式存储数据. 1.Android中三种获取sharedPreferences的方式 1)Context 类中的getSharedPreference ...
- 使用嵌入式关系型SQLite数据库存储数据
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 ...
- Android使用SharedPreference存储数据
SharedPreference存储数据和文件存储更加方便的一点是可以按照一定的数据类型进行存储,同时取数据时也能够获取到相应的数据类型.它是按照map的方式来存储和读取数据的. MainActivi ...
随机推荐
- org.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found :
可能原因: hibernate映射文件hibernate.cfg.xml中mapping中resource写错了文件名或者路径
- yum安装软件报错Segmentation fault处理
yum安装软件报错Segmentation fault处理 在使用yum 更新软件时提示:Segmentation fault 中文错误提示: 段错误 [root@CMS-BAK:/usr/local ...
- python 打印Linux中文编码字符
2018-10-12 12:02:15 星期五 python -c "print '\346\234\215\345\212\241\345\231\250\346\217\220\344\ ...
- VUE中总的逻辑关系和移动端mint-ui的应用接触
1.mint-ui官网:https://mint-ui.github.io/#!/zh-cn 可以点击开始使用,里边有详细的讲解.安装mint-ui: 官网是: 但是应用没有装成功,不知为何,可能是我 ...
- Java中解决前端的跨域请求问题
在最近的分布式项目中,由于前端需要向后台请求数据,但不是同一个域名的,常用的ajax方法并不能成功调用,索然后台有数据返回,但是并不能被前端正常解析. 于是便查询知道了后台返回的数据格式的问题.不能用 ...
- spring官网上下载历史版本的spring插件,springsource-tool-suite
spring官网下载地址(https://spring.io/tools/sts/all),历史版本地址(https://spring.io/tools/sts/legacy). 注:历史版本下载的都 ...
- ansible的Filter
filter的格式: value..| filter() 在python中就是类的实例化 filter(self,*args,**kwargs) self就是filter中管道符前的value. ...
- Javascript我学之二函数定义
本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘 函数 几个要点: a).函数是javascript中的一等公民 (重要性) b ...
- MyString
[摘自C++程序设计语言] MyString.h #include <cstring> #include <iostream> #include <stdexcept&g ...
- AGC-018 C
题意: 有$X + Y + Z$个人,第$i$个人有$Ai$个金币,$Bi$个银币,$Ci$个铜币. 选出$X$个人获得其金币,选出$Y$ 个人获得其银币,选出$Z$个人获得 其铜币,在不重复选某个人 ...