【问题标题】:storing android application data on SD Card在 SD 卡上存储 Android 应用程序数据
【发布时间】:2010-11-15 14:51:40
【问题描述】:

有没有办法将安卓应用程序数据存储在 SD 卡上而不是内存中? 我知道如何将应用程序 sqlite 数据库从内部存储器传输到 SDCard,但是如果内部存储器一开始就满了怎么办?大家是怎么处理的?

【问题讨论】:

    标签: android memory-management android-sdcard


    【解决方案1】:

    使用Environment.getExternalStorageDirectory() 比硬编码“/sdcard”更好 并不总是确定文件夹名称会这样命名。此外,Environment 类提供了一个 getExternalStorageState() 方法来检查外部存储是否可用。

    【讨论】:

    • 这并不总是有效,因为显然三星的 real SD 卡位置是 Environment.getExternalStorageDirectory()+"/external_sd"。其他设备会有不同的位置。
    【解决方案2】:

    开始:

    根据型号/操作系统,您可以通过以下方式访问 sd 卡根目录:

    File externalStorage = Environment.getExternalStorageDirectory();
    

    这将是指内部 sd 存储或内部 sd 内存。

    externalStorage.getAbsolutePath() 
    

    将返回以下值之一

    “/sdcard/”或“/mnt/sdcard/”

    要访问通常从手机/平板电脑外部插入的外部 sd 内存或 micro SD,您必须使用 android 创建的以下文件夹之一指向外部内存:

    "/mnt/sdcard/sd" 
    "/mnt/sdcard/external_sd"
    
    "/sdcard/external_sd"
    "/sdcard/sd" 
    
    "/mnt/sdcard/"
    

    ps:您会注意到内部 sdcard 上有一个空文件夹 external_sdsd

    内存,这个文件夹是空的,用来指向外部的micro sd卡。

    最后确保您对 android manifest xml 中的 sd 卡 android.permission.WRITE_EXTERNAL_STORAGE 具有读/写权限。

    最后你必须指定文件名和你准备好的

    private SQLiteDatabase DB = null;
    
    private static final String DATABASE_NAME = "MyDb.db"; 
    ////////////
    File sdcard = Environment.getExternalStorageDirectory();
    
    String dbfile = sdcard.getAbsolutePath() + File.separator+ "external_sd" + File.separator + DATABASE_NAME;
    
    DB = SQLiteDatabase.openDatabase(dbfile, null,SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    ///////////
    

    你准备好了……

    【讨论】:

    • 不幸的是,这绝对不是标准的。在 LG Optimus 上,它位于 /mnt/sdcard/_ExternalSD 中。我希望谷歌的人会审查所有这些。媒体的命名非常糟糕(外部???),并且文档没有说明当有一个内置时如何访问第二个 sdcard。
    • 能否请您帮忙获取 SD 卡中存在的所有文件夹名称。
    【解决方案3】:

    这是另一个巧妙的小技巧。 Application 有许多方法被调用来获取路径。 特别是,该应用程序具有 getDatabasePath 方法,SQLiteOpenHelper 使用该方法构建路径。 自定义应用程序类可以覆盖这些方法以提供不同的路径,包括 getExternalStorageDirectory 中的路径。

    外部存储是应用程序特定的或公共的。 有方法,替换getExternalStorageDirectory机制, 分别为getExternalFilesDir()getExternalStoragePublicDirectory()

    【讨论】:

      【解决方案4】:

      警告:此答案已过时。您应该使用Environment.getExternalStorageDirectory() 来获取SD卡的根路径,如下面的答案所述。

      旧答案,因此对此的 cmets 有意义:

      /sdcard/ 添加到根目录后,您的路径应该会指示您的Android 应用程序使用SD 卡(至少它与G1 一起工作)。 Android 的文件系统对象使您能够检查文件大小......所以应该可以(如果棘手)编写一些故障转移代码。如果内存已满,此代码将调整您的根路径。

      【讨论】:

      • 如何调整根路径?
      • 调整您正在使用的根路径。 (这有点令人困惑……你不能改变 Android 的根路径)
      • 我使用SQLiteDatabase创建数据库,但是它的构造函数的name参数不能包含路径,我怎么可能在sdcard上创建数据库?
      • developer.android.com/reference/android/database/sqlite/… 使用 openDatabase 调用。第一个参数是路径
      • 我用的是什么 SQLiteOpenHelper,它不走任何路径。
      【解决方案5】:

      某些设备使用 /mnt/sdcard 作为 SD 卡的根点。

      【讨论】:

        【解决方案6】:

        使用 SDCard 的问题在于,您无法可靠地假设它会在您的应用程序需要时始终存在。内部存储器不是这种情况。只要您的应用程序不依赖这些数据来运行它就可以了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-31
          • 1970-01-01
          • 2013-01-11
          • 1970-01-01
          • 2011-04-04
          相关资源
          最近更新 更多