用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 ...
随机推荐
- Chrome 远程代码执行漏洞CVE-2019-5786-EXP
0x01 漏洞原理 CVE-2019-5786是位于FileReader中的UAF漏洞,由Google's Threat Analysis Group的Clement Lecigne于2019-02- ...
- JMeter学习笔记01-安装环境
记录关于JMeter学习的内容.方便复习. 1)JMeter运行环境 因为JMeter是用纯java写的.所以运行的时候需要java的运行环境. 去java官网下载,点免费下载或所有Java下载都行, ...
- Lua中的表达式
[算术操作符] Lua支持常规的算术操作符有:”+”(加法),”-“(减法),”*”(乘法),”/”(除法),”^”(指数),”%”(取模),一元的”-“(负号).所有的这些操作符都用于实数.例如:x ...
- sed 正则 ! 取反
!符号表示取反,x,y!表示匹配不在x和y行号范围内的行,利用sed命令用于的阿银不在2-7之间的行 [111 sed]$ cat input [111 sed]$ sed -n '2,7!p' in ...
- java接口自动化基础知识(二)
二.HttpClient+testNG实现对接口的测试及校验 在上面第一篇中已经实现了基础配置和测试用例数据准备,本篇文章将以登录举例进行测试执行. 这是之前login接口的代码 @Test(grou ...
- C# 微信开发-----微信会员卡(二)
主要说说如何使用微信的激活会员卡 如图: 点击激活会员卡时,要跳转到如下的图片: 要实现这个功能,首先我们在创建会员卡后就操作如下代码 #region 添加激活时的自定义字段 string custo ...
- 如何使用 Lucene 做网站高亮搜索功能?
现在基本上所有网站都支持搜索功能,现在搜索的工具有很多,比如Solr.Elasticsearch,它们都是基于 Lucene 实现的,各有各的使用场景.Lucene 比较灵活,中小型项目中使用的比较多 ...
- ubantu/centos修改系统时间
前言:有时系统上的时间和真实的时间对应不是,或者有特殊需求,需要修改系统时间.但是对应多台的服务器系统更改时间,手动的话很麻烦,这就需要写脚本或者搭建时间服务器了,统一时间,以下是对于一个不同系统修改 ...
- vs调试的时候,指定的参数已超出有效值的范围。参数名:sit ,先仔细看看错误和我的一样不一样
https://www.cnblogs.com/pei123/p/7694947.html 指定的参数已超出有效值的范围.参数名:sit ,先仔细看看错误和我的一样不一样 更新了1709就这样了,的确 ...
- 此处为当前页,设置此处的href点后没有效果
<%--此处当前页不能点,设置href为没有动作Javascript:void(0); --%> 如果javaScript:void(0);写错了,那就很尴尬(某些浏览器忽略该错误如:谷歌 ...