数据的访问与存储

Android有五种数据存储方式:文件存储、SharedPreferences、SQLite数据库、ContentProvider、网络存储。

文件存储: 通过I/O流读写文件,跟Java是一样的,一般用来存储一些较大的数据,如文本、图片、音频、视频等。
SharePreferences: Android中用来存储一些配置信息的方式,XML格式。
SQLite数据库: Android中一种轻量级的数据库,支持SQL语法。
ContentProvider: Android四大组件之一,可实现应用程序之间的数据交换,实现数据共享。
网络存储: 通过将数据存储到服务器,从而实现数据的存储。

文件存储

一种常见的存储方式,类似于Java的I/O流的读取/写入,可存储文本、图片、音频、视频等等。
1.内部存储
内部存储是指将应用程序中的数据以文件的方式存储到设备内部,为所创建的应用程序私有,如果有其他应用程序想要访问该数据,需要访问权限,该数据随着应用程序的消亡而消亡。

//输出流FileOutputStream fos = openFileOutput(String name, int mode);//文件名+操作String content = "要输出的数据";byte[] buffer = content.getBytes();//建立缓冲fos.write(buffer);//写入数据fos.close();//关闭输出流//输入流FileInputStream fis = openFileInput(String name);//文件名byte[] buffer = new byte[fis.available()];//建立缓冲fis.read(buffer);//读取缓冲区fis.close();//关闭输入流

openFileOutput()用来打开应用程序对应输出流,将数据存储到指定文件中;openFileInput()用于打开应用程序对应的输入流,读取指定文件中的数据。

mode的四种取值:
MODE_PRIVATE:只能当前程序读写
MODE_APPEND:可追加内容
MODE_WORLD_READABLE:可被其他应用程序读取
MODE_WORLD_WRITEABLE:可被其他应用程序写入
(注意:文件输入输出流要添加try/catch语句)

File file1 = getFilesDir();//获得当前应用在内部存储上的根目录File file2 = new File(file1, "文件名");//在指定目录创建文件夹File file3 = getCacheDir();//获得缓存目录,该目录在系统空间不足时会被清理deleteFile("文件名");//删除文件

2.外部存储
外部存储是指将文件存储到外部设备上,SD卡、内嵌存储卡等等,是永久性存储,可被其他应用所共享,但这种存储方式不安全,因为可被轻易地浏览、修改和删除。

String state = Environment.getExternalStorageState();//获取外部设备if(state.equals(Environment.MEDIA_MOUNTED)){//判断是否存在外部设备File SDPath = Environment.getExternalStorageDirectory();//获取SD卡目录}

Android系统为例保证应用程序的安全性做了相关规定,如果程序需要访问系统的关键信息,必须在清单文件中申明权限才可以,否则程序会崩溃。操作SD卡的数据是系统中比较重要的,所以需要在清单文件的中t添加SD卡读写权限:

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

在Android6.0以后出于安全考虑,还要在代码中动态申请权限:

private static final int REQUEST_CODE = 1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        RequestPermission();//申请权限    }    void RequestPermission() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)        if (!(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {            String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};            requestPermissions(permissions, REQUEST_CODE);        }    }    //权限回调    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == REQUEST_CODE) {            int grantResult = grantResults[0];            boolean granted = grantResult == PackageManager.PERMISSION_GRANTED;        }    }

更多相关文章

  1. android提示:Gradle DSL method not found: 'android()'
  2. Android基础概念
  3. Android平台开发指导(Android(安卓)Porting Guide)(一)
  4. android selector的用法解析
  5. Android使用JDBC连接mysql数据库
  6. Android设置颜色的几种方法
  7. Android——SQLite数据库
  8. Android系统框架
  9. android基础知识15:获得android系统信息01—info类

随机推荐

  1. Android(安卓)Studio解决依赖文件冲突
  2. 【第765期】你不懂JS:this豁然开朗!
  3. 【第766期】你不懂JS:对象
  4. No.8 bin和sbin的区别
  5. 聊聊“干货”
  6. 【第767期】你不懂JS:混合(淆)“类”的对象
  7. android binder与handler的简要理解
  8. 【早读汇】广州@mogeWCY的《实战ES2015》
  9. 【第769期】2016 JavaScript 发展现状大
  10. 【早读汇】上海@瑞心扉雪《CSS揭秘》笔记