Android中的数据存储

数据持久化就是指那些内存中的瞬时数据保存到存储设备中。Android系统中主要提供了三种方式用于简单地实现

数据持久功能,即文件存储、SharedPreferences存储和数据库存储。

1.文件存储是Android中一种基本的存储方式,它不对存储的内容进行任何的格式化处理,所有的数据是原封不动的

保存到文件中。

1.1

Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件。

这个方法接收两个参数:

1.第一个参数是文件名,(文件名中不可以包含路径,所有的文件都是默认保存在/data/data/<package name>/files/目录下)。

2.第二个参数是文件的操作模式,(主要有两种操作模式可选:1.MODE_PRIVATE和MODE_APPEND,其中

MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容;

MODE_APPEND表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。)

openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象后就可以使用Java流的方式将数据写在文件中了。

下面的代码,展示了如何把一段文本内容写在文件中:

    public void save (String inputText) {
        String data = "Data to Save";
        FileOutputStream out = null;
        BufferedWriter writer = null;

        try {
            out = openFileOutput("data", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

                try {
                    if (writer != null){
                        writer.close();
                    }

                } catch (IOException e) {
                    e.printStackTrace();

                }
            }
    }

上述的代码中,通过openFileOutput()方法能够得到一个FileOutputStream对象,然后在借助它构建出一个

OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,这样就可以通过

BufferedWriter来将文本内容写入到文件中了。

1.2

Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。

这个方法只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下

去加载这个文件,并返回一个FileInputStream对象,得到这个对象后通过java流的方式可以将数据读取出来了。

下面是代码示例,展示如何从文件中读取文本数据:

FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();

        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));

            String line = "";

            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }

上述的代码中,首先通过openFileInput()方法获取得到一个FileInputStream对象,然后借助它构建出一个InputStreamReader对象,

接着再使用InputStreamReader构建出一个BufferedReader对象,这样就可以使用BufferedReader进行一行行地读取,把文件

中的内容全部读取出来并存在在一个StringBuilder对象中,最后将读取的内容返回即可。

2.SharedPreferences是使用键值对的方式来存储数据的。

2.1

要用sharedPreferences来存储数据,首先需要获取到SharedPreferences对象。Android中主要提供了三种方法用于

得到SharedPreferences对象。

1).Context类中的getSharedPreferences()方法

该方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称,如果指定的文件名称不存在则会创建一个,

SharedPreferences文件都是存在/data/data/<package name>/shared_prefs/目录下的;

第二个参数用于指定操作模式,主要有两种模式可以选择,MODE_PRIVATE和MODE_MULTI_PROCESS。

其中MODE_PRIVATE是默认的操作模式,表示只有当前的应用程序才可以对这个sharedPreferences文件进行读写。

MODE_MULTI_PROCESS一般用于对个进程中对同一个SharedPreferences文件进行读写的情况。

2).Activity类中的getPreferences()方法

3).preferenceManager类中的getDefaultSharedPreferences()方法

得到了SharedPreferences对象之后,就可以向文件中存储数据了,主要可以分为三部实现:

1).调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。

2).向SharedPreferences.Editor对象中添加数据。比如添加一个字符串就用putString()方法.

3).调用commit()方法将添加的数据提交.

具体实现如下面的代码所示:

<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/save_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/save_data"/>

</LinearLayout>

设置一个按钮,用于存储数据到文件中。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        saveData = (Button) findViewById(R.id.save_data);

        //对saveData设置监听器
        saveData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
                //Context类中的getSharedPreferences()方法来获取SharedPreferences对象,该方法接收两个参数
                //1.第一个参数用于指定SharedPreferences文件的名称,如果指定的文件不存在,则会创建一个。
                //2.第二个参数用于指定操作模式,主要有两种操作模式可选(MODE_PRIVATE和MODE_MULTI_PROCESS)
                SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
                //向SharedPreferences.Editor对象中添加数据。比如添加一个字符串就用putString()方法
                editor.putString("name","Tom");
                editor.putInt("age",22);
                //调用commit()方法将添加的数据提交
                editor.commit();
            }
        });

上述的代码中,点击按钮通过getSharedPreferences()方法得到SharedPreferences的文件名为data,并得到了

SharedPreferences.Editor的对象。接着添加数据,最后调用commit() 方法进行提交。

2.2

从SharedPreferences中读取数据

SharedPreferences对象中提供了一系列的get方法用于对存储的数据进行读取,每种get方法都对应了

SharePreferences.Editor中的一种put方法。

具体的实现如下面的代码所示:

<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/save_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/save_data"/>

    <Button
        android:id="@+id/restore_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/restore_data"/>

</LinearLayout>

修改MainActivity中的代码,如下图所示:

 restoreData = (Button) findViewById(R.id.restore_data);
        //对restoreData按钮设置监听器
        restoreData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过getSharedPreferences()方法得到SharedPreferences的对象
                SharedPreferences sharedPre = getSharedPreferences("data", MODE_PRIVATE);
                //通过get方法得到数据
                String name = sharedPre.getString("name","");
                int age = sharedPre.getInt("age", 0);

                Log.d("MainActivity","name is " + name);
                Log.d("MainActivity","age is " + age);

            }
        });

上述的代码中,首先通过getSharedPreferences()方法得到了SharedPreferences对象,然后调用get方法获取数据,

如果没有找到相应的值就会使用方法中传入的默认值来代替。

Android学习笔记(十四)的更多相关文章

  1. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  2. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  3. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  4. 【转】Pro Android学习笔记(四):了解Android资源(下)

    处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...

  5. Android学习笔记(四)——再探Intent

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 我们可以使用 Intent 来启动一个活动, 还可以在启动活动的时候传递数据的,下面一起来看一下: 一.向下一 ...

  6. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  7. Android学习笔记_3_四种布局

    Android布局是应用界面开发的重要一环,在Android中,共有四种布局方式, 分别是:FrameLayout( 帧布局 ).LinearLayout (线性布局).TableLayout(表格布 ...

  8. 【转】 Pro Android学习笔记(四八):ActionBar(1):Home图标区

    目录(?)[-] Home Icon 源代码 TextView的滚动 返回主activity或指定activity     ActionBar在Android 3.0 SDK中为平板引入,在4.0中也 ...

  9. 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考

    目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...

  10. 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器

    目录(?)[-] Transaction的一些操作 再谈FragmentManager 调用其他fragment的方法 唤起activity 唤起fragment和相互通信 一些其它 Transact ...

随机推荐

  1. bookstores网上书店测试缺陷报告1

    Bookstore网上书店系统测试缺陷报告   缺陷编号 01.01.0001 发现人 吴赵昕 记录日期 2016-06-10 所属模块 购物车 确认人 吴赵昕 确认日期 2016-06-10 当前状 ...

  2. ocx控件 编译成C#调用的dll 方法 转

      打开VS命令提示行 1.注册ActiveX控件(带上 VCbox.ocx的路径) regsvr32  VCbox.ocx 2.编译OCX文件 aximp VCbox.ocx 生成两个dll文件,项 ...

  3. Thinkphp_View(1)循环输出

    循环输出主要是使用volist和foreach标签输出. VOLIST volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使 ...

  4. jQuery学习总结

    1:jQuery是什么 jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库,兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, O ...

  5. PPT设计宝典!十招教你做出拿得出手的PPT

    据说上班用 excel 的比 word 的工资高,用 ppt 的比用 excel 的工资高.无论如何,在职场演讲汇报中,PPT 扮演着至关重要的角色. 在本文我们将用 10 个超级技巧来解决糟糕的演示 ...

  6. (实用篇)php支付宝接口用法分析

    本文实例讲述了php支付宝接口用法.分享给大家供大家参考.具体分析如下: 现在流行的网站支持平台,支付宝当仁不让的老大了,现在我们就来告诉你如何使用支付宝api来做第三方支付,把支付宝放到自己网站来, ...

  7. Lua Coroutine详解

    协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程 ...

  8. web安全之ssrf

    ssrf(服务器端请求伪造)原理: 攻击者构造形成由服务端发起请求的一个漏洞.把服务端当作跳板来攻击其他服务,SSRF的攻击目标一般是外网无法访问到的内网 当服务端提供了从其他服务器获取数据的功能(如 ...

  9. C# Lock 解读 (关键是理解最后一句)

    最近在研究.NET分布式缓存代码,正好涉及Lock,看了网上的文章,总结了一些Lock相关的知识,供大家一起学习参考. 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其 ...

  10. quartz(1)

    关于定时任务的操作方法,java语言本身具有 Timer 来解决,但Timer 作用起来不是特别的舒服,由于项目的需要,使用了Quartz 这个调度框架,现把学习过程记录下来,方便以后查阅. 本教程是 ...