用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目录下。