概述
在Android开发中,存储(Storage)的方式根据具体的需求不同而不同,例如数据对应用程序是私有的还是其他应用程序(和用户)可以访问的,以及保存数据需要多大的空间。
存储分类
主要的存储方式有以下几种(本文主要涉及前三种):
- Shared Preferences:以键值对( key-value pairs)的方式存储在程序内部;
- Internal Storage:将数据保存在设备内存中;
- External Storage:将公有数据保存在外部存储中(SD卡);
- SQLite Databases:保存结构化数据到私有数据库中;
- Network Connection:通过网络服务器,将数据存储在web上。
涉及知识点
涉及的知识点如下:
- SharedPreferences 共享目录接口,通过Context中的getSharedPreferences进行实例化。
- SharedPreferences.Editor 共享目录编辑器,需要以commit进行保存。
- FileOutputStream 文件输出流,用write方法将数据保存文件。
- FileInputStream 文件输入流,用于读取文件的内容,通过Context中的openFileInput进行实例化,用read方法进行读取内容。
- deleteFile Context中的方法,删除指定路径的文件
- Environment.getExternalStorageDirectory() 获取外部存储的根目录。
- Environment.getExternalStorageState() 获取外部存储卡的状态。
- File.separator 文件路径分割符,用斜杠(/)进行表示。
- BitmapFactory.decodeResource(getResources(), R.drawable.bg) 通过资源文件实例化对象。
- BitmapFactory.decodeFile(imgFile.getAbsolutePath() 通过具体文件的路径实例化对象。
- File 文件对象,mkdirs() 创建多层目录 mkdirs创建单个目录,exists() 判断文件或目录是否存在,createNewFile() 创建新文件。
Shared Preferences
此种方式,只能保存简单的数据类型如下图所示:
代码如下:
1 /** 2 * SharedPreferences保存 3 * @param v 4 */ 5 public void sharedSave(View v){ 6 String name=etName.getText().toString().trim(); 7 String age=etAge.getText().toString().trim(); 8 if(TextUtils.isEmpty(name)||TextUtils.isEmpty(age)){ 9 return; 10 } 11 //构造一个编辑器----笔 12 SharedPreferences.Editor editor = sp.edit(); 13 //数据的存储---只能存储简单的数据 14 editor.putString("name",name); 15 editor.putString("age",age); 16 //提交--保存 17 editor.commit(); 18 //清空 19 etName.setText(""); 20 etAge.setText(""); 21 } 22 23 /** 24 * SharedPreferences读取 25 */ 26 public void sharedRedo(View v){ 27 String name=sp.getString("name",""); 28 String age=sp.getString("age",""); 29 etName.setText(name); 30 etAge.setText(age); 31 }
Internal Storage
将数据内容转换为字节的方式保存在文件中,如下图所示:
代码如下:
1 /** 2 * 内部保存 3 * @param v 4 */ 5 public void internalSave(View v) { 6 String name = etName.getText().toString().trim(); 7 String age = etAge.getText().toString().trim(); 8 if (TextUtils.isEmpty(name) || TextUtils.isEmpty(age)) { 9 return; 10 } 11 12 try { 13 String content = "这是我的姓名:" + name + "这是我的年龄:" + age; 14 FileOutputStream fos = openFileOutput(sname, MODE_PRIVATE); 15 fos.write(content.getBytes()); 16 fos.close(); 17 etName.setText(""); 18 etAge.setText(""); 19 } catch (IOException e) { 20 e.printStackTrace(); 21 } 22 } 23 24 /** 25 * 内部读取 26 * @param v 27 */ 28 public void internalRedo(View v) { 29 try { 30 FileInputStream fis = openFileInput(sname); 31 byte[] buffer = new byte[fis.available()]; 32 fis.read(buffer); 33 fis.close(); 34 String content = new String(buffer); 35 Toast.makeText(this, content, Toast.LENGTH_SHORT).show(); 36 } catch (IOException e) { 37 e.printStackTrace(); 38 } 39 } 40 41 /** 42 * 删除文件 43 * @param v 44 */ 45 public void internalDel(View v){ 46 boolean del=deleteFile(sname); 47 if(del){ 48 Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show(); 49 }else{ 50 Toast.makeText(this, "删除失败", Toast.LENGTH_SHORT).show(); 51 } 52 }
External Storage
在外部存储中,需要在