Android 数据存储。一般有五种: 1、共享首选项。(SharedPReference) 2、内部存储(手机自带存储):①私有缓存文件,②私有存储。 3、外部存储(外/内置存储卡):①外部缓存文件,②外部存储,③外部私有存储,④公共文件目录。 4、SQLite数据库。 5、网络。
下面对以上这些方式做一些解释: 1、SharePreference:最常用的保存的一些小的业务数据,用户状态,或是APP的使用状态记录等。在用户卸载APP的时候数据也会被一起被清空。
SharedPreference sPreference = context.getSharedPreference(key, Context.MODE_PRIVITE);2、私有存储:有两种,分私有缓存存储和私有存储。保存在手机内部存储的都是私有的文件,内部存储在APP被移除的时候文件也会被清空。
①getCacheDir();//获取缓存文件夹,当系统存储不够的时候,系统会通过删除这里面的文件来整理出存储空间。②FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);// 在内部存储中写入文件。3、外部存储:外部存储的私有外部存储是不能被其它应用访问的。而且该目录下的媒体文件不能给MediaStore查询到。在APP被卸载的时候,该目录下文件也会被清除。 外部公共文件目录: getExternalStoragePublicDirectory()用来获取到公共的文件目录,像musics/,pictures/等。 但是访问外部存储需要请求读写权限。而若是需要写权限,那么只需求请求写权限就可以了,因为写权限隐式包含了读权限。 使用外部存储,需要检查是否有设备和设备是否可用,如下代码:
/* Checks if external storage is available for read and write */public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false;}/* Checks if external storage is available to at least read */public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false;}/** getExternalStorageState()方法将返回介质(可理解为(外)内部内存卡)是否处于共享 [连接到计算]、完全缺失、错误移除等状态。然后通过状态来判断APP能否操作。*/①Environment.getExternalStorageDirectory().getPath();//这里这个看网上是获取SD卡的路径。其实并不是的。我自己尝试过,获取的其实是手机存储的路径而不是SD卡路径。②getExternalFilesDir();// 获取应用私有文件。在API18之后获取外部私有文件不需要读写权限。③ContextCompat.getExternalCacheDir(); //获取外部缓存文件④getExternalStoragePublicDirectory(String type);//获取公共文件,type可以传递DIRECTORY_MUSIC、DIRECTORY_PICTURES、DIRECTORY_RINGTONES等。4、数据库SQLite。 5、NetWork.
总结: 1、不管内(外)部缓存文件,都不应该有系统给你维护。而应该是自己去实时检测并且清理。 2、卸载APP的时候SharedPreference,内存存储文件,外部私有存储文件,外部缓存文件,SQLite都会被清除。
参考资料: 存储选项: https://developer.android.com/guide/topics/data/data-storage.html#pref https://developer.android.com/training/articles/scoped-directory-access.html#best https://developer.android.com/guide/topics/providers/document-provider.html
使用PreferenceActivity: https://developer.android.com/guide/topics/ui/settings.html
adb调试: https://developer.android.com/studio/command-line/adb.html#sqlite
新闻热点
疑难解答