• Android:数据持久化(1/2)文件、SharedPreferences


    Summary

    持久化的3种方法:

    • 普通文件:I/O流操作文件;
    • SharedPreferences:XML文件,通过key-value pair的形式存储数据;
    • SQLite:Android自带数据库

    p.s 除了非数据库的方法,其他两种文件存储方法都是使用文件,而且这些文件的目录在rom中定义,因此我们只需关注文件名即可。这么做的原因,我猜是为了方便开发者不用为厂商的各种定制而烦恼吧。


    Description

    普通文件

    使用Android API提供的方法获取相应Input/Output流对象:

    1. Context.openInputFile(String fileName);
      • 返回一个FileInputStream对象;
      • String fileName 为不含目录的文件名,默认目录为/data/data/<package-name>/files/(Nexus系列);
    2. Context.openOutputFile(String fileName, int mode);
      • 返回FileOutputStream对象;
      • String fileName, 同上;
      • int mode 为文件的写入模式,分别有:
        • MODE_PRIVATE 默认方式,即写入的目标文件已经存在的话,直接覆盖原文件;
        • MODE_APPEND 在原文件后添加内容;

    ps. 读取模式mode还有MODE_WORLD_READABLE和MODE_WORLD_WRITABLE两种,由于容易引起安全问题,已经在Android 4.2中被废除


    SharedPreferences

    使用XML文件来对数据进行持久化,并通过操作SharedPreferences的对象来读写数据。

    Android提供了3种方法获取SharedPreferences对象:

    1. Context.getSharedPreferences(String fileName, int mode);
      • String fileName 为XML文件的名称,默认目录为/data/data/<package-name>/shared_prefs/(Nexus系列);
      • int mode 规定了文件的不同读写模式:
        • MODE_PRIVATE 只有当前app能对该文件进行读写;
        • MODE_MULTI_PROCESS 允许多个程序对该文件进行读写;
    2. Activity.getPreferences(int mode);
      • 使用Activity名作为文件名,所以只需要定义读写模式即可;
      • int mode 同上;
    3. PreferenceManager.getDefaultSharedPreference(Context context);
      • 使用当前app的包名作为前缀;

    (3种获取SharedPreference对象的差别仅在于文件名称的定义,分别是自定义、Activity名和App名作为文件名)

    /* 3 ways to get instance of SharedPreferences */
    SharedPreferences prefs;
    prefs = this.getSharedPreferences("APPLE", MODE_PRIVATE);//Context.getSharedPreferences(String fileName, int mode)
    prefs = this.getPreferences(MODE_PRIVATE);//Activity.getPreferences(int mode)
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    
    

    读取数据:

    根据不同的数据类型,使用SharedPreferences对象的get方法即可:
    prefs.getString(String key, String defaultValue);

    • String key 为添加数据时使用的key(参考插入数据部分);
    • String defaultValue 通过key取回的数据如果为null时作为默认值代替null;
    SharedPreferences prefs = this.getSharedPreferences("People", MODE_PRIVATE);
    
    String name = prefs.getString("name", "David");
    int age = prefs.getInt("age", 0);
    int gender = prefs.getInt("gender", 0);
    

    添加数据:

    通过SharedPreferences.Editor来添加数据,要通过commit()来提交数据。

    SharedPreferences prefs = this.getSharedPreferences("People", MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();//获取Editor对象
    
    editor.putString("name", "Luffy");
    editor.putInt("age", 32);
    editor.putInt("gender", 0);
    editor.putString("desc", "Are you kidding me?");
    editor.commit();
    
    editor.clear();
    editor.putString("name", "Chalotte");
    editor.putInt("age", 12);
    editor.putInt("gender", 0);
    editor.putString("desc", "God blesses");
    editor.commit();
    

    SQLite

    Android自带数据库。

    由于数据库的操作相对复杂,另起篇章说明,详情请点击这里。


    Reference 参考

  • 相关阅读:
    前端和后端的区别和分工
    IntelliJ和tomcat中的目录结构
    JAVA开发环境和IntelliJ工具安装
    Linux下Python+Selenium自动化模拟用户登录(备注:记录一次强行卸载rpm依赖包,引发的rpm、yum等命令异常,无法远程xftp工具)
    Docker 操作命令梳理(镜像下载、容器创建、Dockerfile)
    Centos 6.6 Docker安装(内网坏境)
    C# 连接Access2010 数据库之初探
    C#使用NLog记录日志
    现实两种
    C#中的两把双刃剑:抽象类和接口
  • 原文地址:https://www.cnblogs.com/lawrencechen/p/4906092.html
Copyright © 2020-2023  润新知