一:数据存储分类
(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)再次运行程序时,两个框中有第一次输入的值,从而达到了数据的存储与读出
二:内部存储
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目录下存在存储数据的文件
三:外部存储
1:简介
如果想保存数据不想再应用卸载之后随即消失,而仍然存在,则可以采用外部存储,可以将他们保存在外部存储中的任何一个共有的目录中。这里的外部存储介质可以是sdcard中的文件等。如果把sdcard更换之后,某些应用将不能正常加载,因此应该将一些与运行无关且占地较大的文件存储在外部存储器上。存储在外部的数据是全局可读的。其绝对路径为:mnt/sdcard/包名目录下。
2:写数据
(1)在外部的介质上创建一个文件以及文件夹(这时可以做一下判断)
(2)定义输出流OutputStream对象
OutputStream os = new FileOutputStream("存储文件");
|
(3)调用输出流OutputStream对象的write方法,实现数据的存储
(4)关闭输出流
3:读数据
(1)创建InputStream对象
InputStream is = new FileInputStream(存储文件);
|
(2)通过InputStream对象进行数据的读取
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
|
还有一种数据库型的数据存储,我们明日再续哈。。。