当前位置:   article > 正文

Android数据存储五种方式总结_安卓的数据存储

安卓的数据存储

本文介绍Android平台进行数据存储的五大方式,分别如下:   
    1 使用SharedPreferences存储数据
    2 文件存储数据      
    3 SQLite数据库存储数据
    4 使用ContentProvider存储数据
    5 网络存储数据

第一种: 使用SharedPreferences存储数据

SharedPreferencese的使用:https://blog.csdn.net/augfun/article/details/54563808

    适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等。

核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data/<package name>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。 SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例

  1. class ViewOcl implements View.OnClickListener{
  2. @Override
  3. public void onClick(View v) {
  4. switch(v.getId()){
  5. case R.id.btnSet:
  6. //步骤1:获取输入值
  7. String code = txtCode.getText().toString().trim();
  8. //步骤2-1:创建一个SharedPreferences.Editor接口对象,lock表示要写入的XML文件名,MODE_WORLD_WRITEABLE写操作
  9. SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit();
  10. //步骤2-2:将获取过来的值放入文件
  11. editor.putString("code", code);
  12. //步骤3:提交
  13. editor.commit();
  14. Toast.makeText(getApplicationContext(), "口令设置成功", Toast.LENGTH_LONG).show();
  15. break;
  16. case R.id.btnGet:
  17. //步骤1:创建一个SharedPreferences接口对象
  18. SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE);
  19. //步骤2:获取文件中的值
  20. String value = read.getString("code", "");
  21. Toast.makeText(getApplicationContext(), "口令为:"+value, Toast.LENGTH_LONG).show();
  22. break;
  23. }

第二种: 文件存储数据

核心原理: Context提供了两个方法来打开数据文件里的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。

具体有以下值可选

MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可   以使用Context.MODE_APPEND
MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
 除此之外,Context还提供了如下几个重要的方法:
getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录
File getFilesDir():获取该应用程序的数据文件夹得绝对路径
String[] fileList():返回该应用数据文件夹的全部文件

  1. public String read() {
  2. try {
  3. FileInputStream inStream = this.openFileInput("message.txt");
  4. byte[] buffer = new byte[1024];
  5. int hasRead = 0;
  6. StringBuilder sb = new StringBuilder();
  7. while ((hasRead = inStream.read(buffer)) != -1) {
  8. sb.append(new String(buffer, 0, hasRead));
  9. }
  10. inStream.close();
  11. return sb.toString();
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. return null;
  16. }
  17. public void write(String msg){
  18. // 步骤1:获取输入值
  19. if(msg == null) return;
  20. try {
  21. // 步骤2:创建一个FileOutputStream对象,MODE_APPEND追加模式
  22. FileOutputStream fos = openFileOutput("message.txt",
  23. MODE_APPEND);
  24. // 步骤3:将获取过来的值放入文件
  25. fos.write(msg.getBytes());
  26. // 步骤4:关闭数据流
  27. fos.close();
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }

openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.tony.app/files/message.txt,
 下面讲解某些特殊文件读写需要注意的地方:
读写sdcard上的文件
其中读写步骤按如下进行:
1、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录
3、使用IO流操作SD卡上的文件 
注意点:手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡
           必须在AndroidManifest.xml上配置读写SD卡的权限

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

案例代码:

  1. // 文件写操作函数
  2. private void write(String content) {
  3. if (Environment.getExternalStorageState().equals(
  4. Environment.MEDIA_MOUNTED)) { // 如果sdcard存在
  5. File file = new File(Environment.getExternalStorageDirectory()
  6. .toString()
  7. + File.separator
  8. + DIR
  9. + File.separator
  10. + FILENAME); // 定义File类对象
  11. if (!file.getParentFile().exists()) { // 父文件夹不存在
  12. file.getParentFile().mkdirs(); // 创建文件夹
  13. }
  14. PrintStream out = null; // 打印流对象用于输出
  15. try {
  16. out = new PrintStream(new FileOutputStream(file, true)); // 追加文件
  17. out.println(content);
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. } finally {
  21. if (out != null) {
  22. out.close(); // 关闭打印流
  23. }
  24. }
  25. } else { // SDCard不存在,使用Toast提示用户
  26. Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show();
  27. }
  28. }
  29. // 文件读操作函数
  30. private String read() {
  31. if (Environment.getExternalStorageState().equals(
  32. Environment.MEDIA_MOUNTED)) { // 如果sdcard存在
  33. File file = new File(Environment.getExternalStorageDirectory()
  34. .toString()
  35. + File.separator
  36. + DIR
  37. + File.separator
  38. + FILENAME); // 定义File类对象
  39. if (!file.getParentFile().exists()) { // 父文件夹不存在
  40. file.getParentFile().mkdirs(); // 创建文件夹
  41. }
  42. Scanner scan = null; // 扫描输入
  43. StringBuilder sb = new StringBuilder();
  44. try {
  45. scan = new Scanner(new FileInputStream(file)); // 实例化Scanner
  46. while (scan.hasNext()) { // 循环读取
  47. sb.append(scan.next() + "\n"); // 设置文本
  48. }
  49. return sb.toString();
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. } finally {
  53. if (scan != null) {
  54. scan.close(); // 关闭打印流
  55. }
  56. }
  57. } else { // SDCard不存在,使用Toast提示用户
  58. Toast.makeText(this, "读取失败,SD卡不存在!", Toast.LENGTH_LONG).show();
  59. }
  60. return null;
  61. }

第三种:SQLite存储数据

SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧

https://blog.csdn.net/augfun/article/details/54563972

第四种:ContentProvider

ContentProvider是一种内容共享型组件,它通过Binder向其他组件乃至其他应用提供数据。当ContentProvider所在的进程启动时,ContentProvider会同时启动并被发布到AMS中。需要注意的是,这个时候ContentProvider的onCreate要先于Application的onCreate而执行,这在四大组件中是一个少有的现象。系统预置了许多ContentProvider,比如通讯录信息、日程表信息等,要跨进程访问这些信息,只需要通过ContentResolver的query、update、insert和delete方法即可。

https://blog.csdn.net/augfun/article/details/55805594

第五种:网络存储数据

android网络编程:https://blog.csdn.net/augfun/article/details/54590018

android端实现断点续传下载:https://blog.csdn.net/augfun/article/details/54664979

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/576320
推荐阅读
相关标签
  

闽ICP备14008679号