Android学习笔记(十四)

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方法获取数据,

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

时间: 2024-11-03 22:13:48

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

Android学习笔记十四.深入理解fragment(二) 之《图书详情》实战

深入理解fragment(二) 之<图书详情>实战 通过上一篇博文<深入理解fragment一>,我们学习了Android-Fragment的核心知识点.现在在此基础上,利用Fragment技术开发一款适用于大屏幕手机/平板的查找图书详情的应用软件.该项目主要在于两方面,一是Activity.Fragment的源码实现:二是,布局界面资源文件的实现. 1.res/../BookListFragment.java: 自定义类,继承于ListFragment,无需实现OnCreateV

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

目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖排时,如下图显示: 屏幕上只显示一个fragment,点击列表上的数目,进入到简介的activity.下面介绍实现的方式. 设置横排和竖排的不同排版风格 在 Pro Android学习笔记(四):了解Android资源(下)的“资源和配置的变更”中,我们介绍了如何同资源文件夹名设置不同资源.缺省的l

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri

Android学习笔记(四) Fragment

1.从网上看了许多篇关于Fragment的简要介绍,发现都是相类似的理解,而且都是草草地说与Activity大致相同就了事,都没有说清楚Activity与Fragment的具体的关联与区别,一大堆的rubbish. 在此我也记录下本人的rubbish理解: 关于Fragment的生命周期问题,确实应该是如大多数人所说,与Activity相类似,用法也相类似,但是这并不足以教会我们怎样去使用Fragment. Fragment应该是作为Activity的一部分,更像动态的panel(也许实际上真的

Swift学习笔记十四:构造(Initialization)

类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值.存储型属性的值不能处于一个未知的状态. 你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值.以下章节将详细介绍这两种方法. 注意: 当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器(property observers). 一.基本语法 class Human{ var name :String init(){ name = "human" } init(n

laravel3学习笔记(十四)

原作者博客:ieqi.net ==================================================================================================== 运行时配置 在 Laravel3 中很多地方我们都可以看到“约定大于配置”的影子,我本人也很喜欢这种工程哲学尤其是在框架领域,当然这并不能代替所有的配置.我们知道 Laravel3 中,主要配置都写在 application/config 文件夹下,在应用逻辑中,往往

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android学习笔记(四三):文件访问

之前我们学习了通过preference和SQLite数据库进行数据存储,也可以通过文件方式.文件可以是在应用打包时预置,也可以是应用所生成. 文件访问有两种方式:一:静态数据的文件可以防止在res/raw中,这些文件是只读的,只有在应用版本升级的时候进行修改,或者我们先读出这些数据,通过 reference的方式来处理,这样以后可以进行修订,但是这种方式,会有两份数据保存.二:另一种方式是通过URL访问文件,动态数据的读取也可以采用SQLite3的方式. res/raw/下静态文件的读取 在re

Android学习笔记(四八):提供自己的Content Provider

在上一次的学习中,采用了原生的内容提供者Contact,Contact有多层映射关系,比较复杂,并非作为小例子的好选择,在本次学习中,我们将学习如何建立Content Provider,并通过Uri进行增删改查.如果应用的数据只需自己使用,并不需要content provider,相反避免这样做,可直接访问数据:但是若希望数据可以被其他应用访问,创建content provider就是常规手段. 再谈Content Provider的Uri 在上一次学习中,我们谈到了Uri的格式.现在已cont

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

目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transaction进行切换,很方便提供切换的效果. 利用setTransition() 在Pro Android学习笔记(三九):Fragment(4):基础小例子-续的“Step 4:实现showDetail(int index),如何管理fragment”中,介绍了如何在容器FrameLayout中通过frag