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

上一篇:boost线程的问题:


下一篇:Android Studio中常用设置与快捷键