一、用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或文件的方式存储数据的更多相关文章

  1. 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)

    https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...

  2. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  3. Android提供了5种方式存储数据:

    --使用SharedPreferences存储数据: --文件存储数据: --SQLite数据库存储数据: --使用ContentProvider存储数据: --网络存储数据: 一:使用SharedP ...

  4. 搭建zipkin并以mysql的方式存储数据

    zipkin以mysql的方式存储 (centos+java8+mysql+zipkin2.3.1) 前言: 这篇教程用于搭建已mysql作为存储的zipkin.(还不知道zipkin是什么的小伙伴请 ...

  5. data-*属性——使用自定义属性的方式存储数据

    HTML5提供了data-*属性能存储页面或应用程序的私有自定义数据.只需在属性前加上data-前缀即可,值可以是任意字符串. 存储的(自定义)数据能够被页面的 JavaScript 中利用,以创建更 ...

  6. 为什么很多 Android 程序喜欢在存储卡根目录建文件夹来存储数据而不是 Android/data 目录下?

    知乎回答.   http://www.zhihu.com/question/19866689   pansz,欢迎评论 知乎用户.弓长.知乎用户 赞同 这个道理很简单:因为没人管啊.你乱存放文件,在a ...

  7. sharedPreferences存储数据

    sharedPreferences使用的是键值对的方式存储数据. 1.Android中三种获取sharedPreferences的方式 1)Context 类中的getSharedPreference ...

  8. 使用嵌入式关系型SQLite数据库存储数据

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 ...

  9. Android使用SharedPreference存储数据

    SharedPreference存储数据和文件存储更加方便的一点是可以按照一定的数据类型进行存储,同时取数据时也能够获取到相应的数据类型.它是按照map的方式来存储和读取数据的. MainActivi ...

随机推荐

  1. k64 datasheet学习笔记22---Direct Memory Access Controller (eDMA)

    0.前言 本文主要介绍DMA相关内容 1.简介 DMA模块包含: 1.一个DMA引擎 源和目的地址的计算 数据搬移 2.本地存储的传输控制描述TCD,对于16个传输通道中的每一个各对应一个TCD 1. ...

  2. vue之vuex学习

    知识点一:vuex是状态管理器(单向数据流) 每个Vuex应用程序的核心是商店.“商店”基本上是一个容纳您的应用程序状态的容器.有两件事使Vuex商店与普通的全局对象不同: Vuex商店是被动的.当V ...

  3. 关于 min_25 筛的入门以及复杂度证明

    min_25 筛是由 min_25 大佬使用后普遍推广的一种新型算法,这个算法能在 \(O({n^{3\over 4}\over log~ n})\) 的复杂度内解决所有的积性函数前缀和求解问题(个人 ...

  4. 服务器资源迁移到aliyun对象存储及oss的权限管理配置

    chinasoft-download增值服务的迁移和部署 需求: 增值服务网站需要从网宿迁移到阿里云,以前的增值服务历史软件存放在服务器中需要迁移到阿里云的oss中存放 需要改造程序给程序添加一个os ...

  5. 【原创】运维基础之Ansible(1)简介、安装和使用

    官方:https://www.ansible.com/ 一 简介 Ansible is a radically simple IT automation engine that automates c ...

  6. js——图片懒加载

    <img class="js-lazy-image centered" src="./img/dog-running.svg" width="4 ...

  7. C#+EntityFramework编程方式详细之Model First

    Model First Model First模式即“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在VS中 ...

  8. vmware虚拟机使用静态IP上网的方法

    本文转自:https://www.cnblogs.com/flyfish919/p/7083523.html 作者:云里有棵树 我的物理机使用的是路由wifi,然后虚拟机使用静态IP上网的方法总结如下 ...

  9. Linux 包管理

    1 文集 <Linux 包管理基础:apt.yum.dnf 和 pkg>,由Snapcrafter翻译,英文原创(作者Brennen)地址在这里. 这是一篇不错的概括性的文章,系统介绍了D ...

  10. iOS之UIApplicatio、AppDelegate

    UIApplication,代表的是整个应用做的事,因此每个程序只能有一个,系统使用的是单例模式,就是[UIApplication sharedApplication]来得到一个实例. 这个单例实例是 ...