zoukankan      html  css  js  c++  java
  • Android中存储目录认识

    1、存储基本认识

    参考自:https://blog.csdn.net/u010937230/article/details/73303034

    其他:

    (1)存储权限:应用对内部存储和外部存储私有目录读写不需要申请权限,对外部存储的公有目录读写需要获取android.permission.READ_EXTERNAL_STORAGE和android.permission.WRITE_EXTERNAL_STORAGE权限,之后才能进行Environment.getExternalxxxxx()相关目录的读写,而这两个权限在安卓10及以后的版本中将逐渐收紧。

    (2)清除数据: 表示清除内部存储和外部存储私有目录下的所有文件

    清除缓存:表示清除getCacheDir()和getExternalCacheDir()两个目录下的文件。

    应用卸载:应用卸载后会清除数据, 外部存储下除私有目录外,其他目录都不能通过清除数据和清除缓存来删除残留文件,这也是应用卸载后文件残留的原因。

    (3)应用双开:应用双开的情况下, 上述目录会将目录中的0替换为对应的数字, 该数字与手机厂商有关,如将/data/user/0/com.example.test/替换为/data/user/999/com.example.test/

    2、五种存储方法存储目录分析

    2.1、SharedPreferences存储

    ​ 通常使用如下代码获取SharedPreferences实例:

    SharedPreferences preferences = context.getSharedPreferences("test", MODE_PRIVATE);
    

    getSharedPreferences是Context类的一个抽象方法,其具体实现在android.app.ContextImpl类中:

        @Override
        public SharedPreferences getSharedPreferences(String name, int mode) {
            // At least one application in the world actually passes in a null
            // name.  This happened to work because when we generated the file name
            // we would stringify it to "null.xml".  Nice.
            if (mPackageInfo.getApplicationInfo().targetSdkVersion <
                    Build.VERSION_CODES.KITKAT) {
                if (name == null) {
                    name = "null";
                }
            }
    
            File file;
            synchronized (ContextImpl.class) {
                if (mSharedPrefsPaths == null) {
                    mSharedPrefsPaths = new ArrayMap<>();
                }
                file = mSharedPrefsPaths.get(name);
                if (file == null) {
                    file = getSharedPreferencesPath(name);
                    mSharedPrefsPaths.put(name, file);
                }
            }
            return getSharedPreferences(file, mode);
        }
        
        public File getSharedPreferencesPath(String name) {
            return makeFilename(getPreferencesDir(), name + ".xml");
        }
        
        private File getPreferencesDir() {
            synchronized (mSync) {
                if (mPreferencesDir == null) {
                    mPreferencesDir = new File(getDataDir(), "shared_prefs");
                }
                return ensurePrivateDirExists(mPreferencesDir);
            }
        }
    

    ​ 于是对名称为test的SharedPreferences, 其存储文件为test.xml, 存储目录为Context.getDataDir() + "shared_prefs", 是在内部存储中,即/data/user/0/com.example.test/shared_prefs。

    2.2、SQLite数据库存储

    ​ 同样的,获取数据库文件的方法为public File getDatabasePath(String name),内部数据库文件目录为

        private File getDatabasesDir() {
            synchronized (mSync) {
                if (mDatabasesDir == null) {
                    if ("android".equals(getPackageName())) {
                        mDatabasesDir = new File("/data/system");
                    } else {
                        mDatabasesDir = new File(getDataDir(), "databases");
                    }
                }
                return ensurePrivateDirExists(mDatabasesDir);
            }
        }
    

    ​ databases目录与shared_prefs目录同级。

    2.3、文件存储

    ​ 文件存储目录主要看需求,应用私有数据应当存储在内部私有存储或者外部私有存储, 像媒体文件等可以存放在DCIM等目录。

    2.4、Content Provider

    ​ Content Provider存储目录要看其所属的应用将相关的数据存放在哪个位置, 例如通讯录、通话记录、短信等数据,由对应的应用进行管理。

    2.5、网络存储数据

    ​ 应用从网络中获取数据, 对应的数据由响应的服务器进行管理。

  • 相关阅读:
    java代码连接数据库
    phpcms v9 读取地区联动菜单缓存文件
    PHPCMS V9二次开发便捷自定义后台入口文件夹
    phpcms v9中模板标签使用及联动菜单
    Phpcms v9系统类库与函数库调用方法
    phpcms v9 二次开发
    phpcms v9开源开发框架基础mvc解读
    phpcms插件开发初步规范
    phpcms v9二次开发之模型类的应用(1)
    phpcms v9二次开发之模型类的应用(2)
  • 原文地址:https://www.cnblogs.com/wushengwuxi/p/15167336.html
Copyright © 2011-2022 走看看