Android_数据存储

Android_数据存储(文件存储)

Android中为开发者提供了三种数据持久化的方法:文件存储、SharedPreference存储、以及数据库存储。这篇Blog主要介绍的是文件存储和SharedPreference存储。

在开始之前,先来了解点东西,如果没有太大的兴趣可以直接跳到正文看。
瞬时数据? 瞬时数据就是那些存储在内容当中,有可能会因为程序关闭或其他原因导致内存被回收而丢弃的数据。Android中真是为了防止这种情况的出现才有了数据存储。

文件存储

文件存储比价适合用于存储一些简单的文本数据或二进制数据。

1、Context类提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。使用该方法需要两个参数:第一个: 文件名,在文件创建的时候使用的就是这个名称,这个文件名不包括路径。这个文件默认是存放在/data/data/packagename/files/目录下的(这个路径只是相对于虚拟机来说,如果你用的是真机,那就不一定。)第二个:
文件的操作模式,主要有两种模式可选:MODE_PRIVATE 是默认的操作模式,当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容MODE_APPEND 表示如果该文件已存在就往文件中追加内容,不存在就创建新文件。 其实还有两种模式:MODE_WORLD_READABLEMODE_WORLD_WRITEABLE 不过这两种已在Android4.2版本中被废弃了。

2、Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。该方法只接收一个参数,就是要读取的文件名,然后在系统自动到data/data/packagename/files/目录下去加载这个文件,并放回一个FileInputStream对象。

说了这么多,我们也该来真正的实战一下了:
我常见了一个项目,它的界面中有一个EditText控件,当我们输入完内容后,按Back键将退出这个程序,并将输入的内容保存到文件中,当我们再一次进入到这个程序的时候,我们要从文件中读取内容,并显示在界面上。
1、下面就来看一下activity_main.xml文件中的代码,其实就一个EditText控件。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <EditText
        android:id="@+id/main_et_Input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Input Something word" />
</LinearLayout>

2、我的MainActivity中的代码其实也比较简单,大家一看就明白了;

public class MainActivity extends Activity {
    private EditText etInput;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        etInput=(EditText) findViewById(R.id.main_et_Input);
        String returnString =load();
        if (!TextUtils.isEmpty(returnString)) {
            etInput.setText(returnString);
            Toast.makeText(this,"Restoring succeeded",Toast.LENGTH_SHORT).show();
        }
    }
    /**
     * 从文件中读取数据
     */
    public String load(){
        FileInputStream inputStream=null;
        BufferedReader reader =null;
        StringBuffer content =new StringBuffer();
        try {
            inputStream=openFileInput("data");
            reader =new BufferedReader(new InputStreamReader(inputStream));
            String line ="";
            while ((line=reader.readLine())!=null) {
                content.append(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (reader!=null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        String inputString =etInput.getText().toString();
        save(inputString);
    }

    /**
     * 保存内容到文件中
     * @param input 需要保存到文件中的数据
     */
    public void save(String input){
        FileOutputStream outputStream=null;
        BufferedWriter bufferedWriter=null;
        try {
            outputStream = openFileOutput("data",Context.MODE_PRIVATE);
            bufferedWriter =new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write(input);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedWriter!=null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在这里我有一个问题,希望看到我这篇Blog的大神们,能够帮我解答一下,小白感激不尽。问题就是,我用真机运行上面的代码的时候,如何才能看见data这个文件?换句话说就是,我如何才能在真机中访问到data/data/packagename/files/这个目录??

SharedPreferences存储

SharedPreference是使用键值对的方式来存储数据的。我们也可以通过通过键来获取到所对应的数值。SharedPreference还支持多种不同的数据存储。要想用SharedPreference存储数据,肯定要先获得SharedPreference的实例。Android中提供了三种获取该对象的实例:
1、Context类中的getSharedPreferences()方法
该方法接受两个参数,第一个参数: 指定SharedPreference文件的名称,如果指定的文件不存在则会创建一个,SharedPreference文件都是存放在/data/data/packagename/shared_prefs/目录下的。第二个参数: 指定操作模式,MODE_PRIVATE 是默认的操作模式,表示只有当前的应用程序才可以对这个SharedPreference文件进行读写。MODE_MULIT_PROCESS 一般用于对多个进程中对同一个SharedPreferences文件进行读写的情况。

2、Activity类中的getPreferences()方法
这个方法只接收一个操作模式的参数,使用这个方法会自动将当前活动的类名作为SharedPreference的文件名。

3、PreferenceManager类中的getDefaultSharedPreferences()方法
这个方法接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。

下面就让我们来小小的实践一下吧。
1、布局文件的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SharedPreferenceTest" >
    <Button
        android:id="@+id/btn_savaData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击保存数据" />
    <Button 
        android:id="@+id/btn_restoreData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="恢复数据"
        />
</LinearLayout>

2、我的MainActivity中的代码如下:

public class SharedPreferenceTest extends Activity {
    private Button btnSavaData,btnRestoreData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shared_preference_test);
        btnSavaData=(Button) findViewById(R.id.btn_savaData);
        btnRestoreData=(Button) findViewById(R.id.btn_restoreData);
        btnSavaData.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Editor editor=
                        (getSharedPreferences("data", Context.MODE_PRIVATE))
                        .edit();
                editor.putString("name", "Tome");
                editor.putInt("age", 23);
                editor.putBoolean("marry", false);
                editor.commit();
            }
        });
        btnRestoreData.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                SharedPreferences spf =getSharedPreferences
                        ("data", Context.MODE_PRIVATE);
                String name =spf.getString("name", "LiLi");
                int age =spf.getInt("age", 0);              
                boolean marry =spf.getBoolean("marry", false);
                Log.i("SharedPreference", "name:"+name);
                Log.i("SharedPreference", "age:"+age);
                Log.i("SharedPreference", "marry:"+marry);
            }
        });
    }
}

3、当我点击保存数据的时候,大家可以看一下,我拿到的data.xml这个文件中的数据:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="marry" value="false" />
<string name="name">Tome</string>
<int name="age" value="23" />
</map>

4、当我点击恢复数据的按钮以后,看一下我打印的Log日志:

06-07 08:14:12.788: I/SharedPreference(1839): name:Tome
06-07 08:14:12.788: I/SharedPreference(1839): age:23
06-07 08:14:12.788: I/SharedPreference(1839): marry:false

这两种存储方法都比价简单,相信大家都已经掌握原理了,只是需要多加练习,你就是以后的大神。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值