• 用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 + "
    上次生成的随机数为:" + 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目录下。

  • 相关阅读:
    Python中replace 不起作用的问题
    java 获取视频时长、大小
    MySQL 自定义排序
    加 synchronized 关键字进行同步
    SQL 查询当前周的开始、结束日期
    Java 按照一定的规则生成递增的编号
    Java中BigDecimal的8种舍入模式
    Lamada 表达式之 sort 排序
    搭建Java环境
    初识JAVA(学习记录)
  • 原文地址:https://www.cnblogs.com/vonzc/p/10498687.html
Copyright © 2020-2023  润新知