一:数据存储分类

   (1)SharedPreferences

   以键值对的形式保存简单的,私有的数据

   (2)内部存储

   把私有数据保存在手机内部的存储介质中

   (3)外部存储

   把公共的数据保存在共享的外部介质中

   (4)SQLite数据库

   把结构化的数据保存在一个私有的数据库中

   二:SharedPreferences

   1:简介

   SharedPreferences适用于存储简短的基本数据类型,以键值对的形式将数据存储在应用程序的目录中,其绝对路径为:data/data/包名/shared_prefs/。

   2:读数据

   (1)创建SharedPreferences对象

SharedPreferences shared = getSharedPreferences("存储的文件名", Activity.MODE_PRIVATE);//第二个参数表示以私有的形式保存数据,以免泄露数据

   (2)调用SharedPreferences对象的getString的形式获取键值为String类型对应的值,若键值为其他类型,可自行调用其他get方法

shared.getString("name", "");//第一个参数为键值名,必须和数据存储时的键值相对应,第二个参数一般默认为空

   3:写数据

   通过在界面退出的那一刻完成数据的存储,因此下面的内容应该书写在onStop方法中:

   (1)创建SharedPreferences对象

SharedPreferences shared = getSharedPreferences("存储的文件名", Activity.MODE_PRIVATE);//第二个参数表示以私有的形式保存数据,以免泄露数据

   (2)通过SharedPreferences对象,得到SharedPreferences.Editor对象

SharedPreferences.Editor editor = SharedPreferences对象.edit();

   (3)通过SharedPreferences.Editor对象的putString("键","值")的方法存储数据,这里只是暂时存储

editor.putString("键","值");

   (4)调用SharedPreferences.Editor对象的commit()方法存储数据,这时才真正的做到数据存储

SharedPreferences.Editor对象.commit();

   4:应用

   功能:通过在EditText中输入数据完成数据的存储与读出

   ◆主Activity

public class MainActivity extends Activity {
    //在activity_main.xml文件中拖入两个EditText控件,声明控件
    private EditText et1,et2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //根据ID查找到两个控件
        et1 = (EditText) findViewById(R.id.editText1);
        et2 = (EditText) findViewById(R.id.editText2);
        //创建SharedPreferences对象
        SharedPreferences shared = getSharedPreferences("liu", Activity.MODE_PRIVATE);
        //数据的读出:保证Activity一运行就出现在EditText框中
        et1.setText(shared.getString("name", ""));
        et2.setText(shared.getString("password", ""));
    }
    //重写onStop方法,使得程序一结束运行时,就完成数据的存储
    @Override
    protected void onStop() {
        //创建SharedPreferences对象
        SharedPreferences shared = getSharedPreferences("liu", Activity.MODE_PRIVATE);
        //创建SharedPreferences.Editor对象,完成数据的存储
        SharedPreferences.Editor editor = shared.edit();
        //数据的暂时存储在editor对象中
        editor.putString("name", et1.getText().toString());
        editor.putString("password", et2.getText().toString());
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
        //保存:这时才完成了数据的存储      
        editor.commit();      
        super.onStop();
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
}

   ◆结果:    (这里只是为了说明数据存储,界面的布局没有设计的很好)

   (1)第一次运行时,两个控件中的内容个为空。先在两个EditText输入点东西

   (2)点击返回键,程序退出

   (3)在DBMS下的data/data/包名/shared_prefs/目录下,就可以看到自己定义的存储文件,导出,查看即可

   (4)再次运行程序时,两个框中有第一次输入的值,从而达到了数据的存储与读出

132704263.jpg

   二:内部存储

   1:简介

   内部存储就是通过流的方式,将数据存储在应用程序的目录中,用户卸载应用之后,数据也会被删除。默认情况下,数据为私有存储,除本应用以外的其他应用不鞥访问。其绝对路径为:data/data/应用程序包名

   2:写数据

   (1)创建FileOutputStream对象

FileOutputStream fos = openFileOutput("存储文件名",MODE_PRIVATE);//第二个参数指明数据的存储是以私有的方式存储的

   (2)调用FileOutputStream对象的write方法进行数据的写入

fos.write(写入数据的Byte形式);//如:若是String类型的数据str,只需str.getBytes()方法就能得到数据的Byte形式

   (3)关闭输出流

FileOutputStream对象.close();

   3:读数据

   (1)创建FileInputStream对象

FileInputStream fis = openFileInput("存储文件名");

   (2)创建包装流对象BufferedReader,以缓冲区的形式读取数据

BufferedReader br = new BufferedReader(new InputStreamReader(fis));//InputStreamReader作为BufferedReader 和FileInputStream之间的转换桥梁

   (3)创建StringBuffer对象来进行读出数据的暂时存储(也不是必须的)

StringBuffer sb = new StringBuffer();

   (4)根据包装流对象BufferedReader的readLine()方法,判读是不是读到文件末尾,若不是末尾,则用StringBuffer对象存储读出来的这个字符串,方便 以后的输出等操作

while((line=br.readLine())!=null){
                sb.append(line);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
            }

   4:应用

   ◆主Activity

public class MainActivity extends Activity {
    private String fileName = "ll";// 存储文件名
    private String data = "nihao";// 要存储的数据
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        writeData();
        readData();
    }
    public void writeData() {
        try {
            // 创建FileOutputStream对象
            FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE);
            //写操作
            fos.write(data.getBytes());
            //关闭输出流
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
    public void readData(){
        try {
            //创建FileInputStream对象
            FileInputStream fis = openFileInput(fileName);
            //创建包装流对象BufferedReader
            BufferedReader br = new BufferedReader(new InputStreamReader(fis));
            String line = null;//
            StringBuffer sb = new StringBuffer();//定义变量进行数据的暂时存储
            while ((line = br.readLine()) != null) {
                sb.append(line);//读出的若不为空,直接存储在StringBuffer对象中
            }
            //输出验证一下
            System.out.println("***" + sb.toString() + "***");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

   ◆结果:

   控制台输出存储的数据

01-03 19:45:11.413: I/System.out(7576): ***nihao***

   在DBMS下的data/data/包名/files目录下存在存储数据的文件

135222818.jpg

   三:外部存储

   1:简介

   如果想保存数据不想再应用卸载之后随即消失,而仍然存在,则可以采用外部存储,可以将他们保存在外部存储中的任何一个共有的目录中。这里的外部存储介质可以是sdcard中的文件等。如果把sdcard更换之后,某些应用将不能正常加载,因此应该将一些与运行无关且占地较大的文件存储在外部存储器上。存储在外部的数据是全局可读的。其绝对路径为:mnt/sdcard/包名目录下。

   2:写数据

   (1)在外部的介质上创建一个文件以及文件夹(这时可以做一下判断)

   (2)定义输出流OutputStream对象

OutputStream  os = new FileOutputStream("存储文件");

   (3)调用输出OutputStream对象的write方法,实现数据的存储

os.write(数据的Byte形式);

   (4)关闭输出流

os.close();

   3:读数据

   (1)创建InputStream对象

InputStream is = new FileInputStream(存储文件);

   (2)通过InputStream对象进行数据的读取

is.read()

   3:添加权限,在AndroidManifest.xml中添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

   3:应用

   ◆主Activity

public class MainActivity extends Activity {
    private File file = new File("mnt/sdcard/anjoyo/liu.txt");// 创建文件夹及文件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        isExists();//文件是否存在
        writeData();//数据的存储
        readData();//数据的读取
    }
    //文件是否存在
    public void isExists() {
        if (!file.exists()) {// 判断文件是否存在,文件若不存在
            File f = file.getParentFile();// 获得父级文件夹
            if (!f.exists()) {// 判断父级文件夹是不是存在,若不存在
                f.mkdir();// 则创建文件夹
            }
            try {
                file.createNewFile();// 文件若不存在,则创建文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //数据的存储
    public void writeData() {
        try {
            // 输出流
            OutputStream os = new FileOutputStream(file);
            // 写操作
            os.write(new String("hello").getBytes());
            // 关闭流
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //数据的读取
    public void readData() {
        try {
            //读数据的流
            InputStream is = new FileInputStream(file);
            char ch;
            //调用read方法进行数据的读操作
            for (int i = 0; i < file.length(); i++) {
                if ((ch = (char) is.read()) != -1) {
                    System.out.println(ch);
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

   ◆结果

   在DBMS中的"mnt/sdcard/anjoyo/"目录下存在存储文件liu.txt。(自行查看哦)

   在控制台中,结果如下

01-03 23:06:00.732: INFO/System.out(4094): h
01-03 23:06:00.732: INFO/System.out(4094): e
01-03 23:06:00.732: INFO/System.out(4094): l
01-03 23:06:00.732: INFO/System.out(4094): l
01-03 23:06:00.741: INFO/System.out(4094): o

   

   还有一种数据库型的数据存储,我们明日再续哈。。。j_0023.gif