我做了一些测试,并使用Android模拟器输出了一些路径:
内部存储context.getFilesDir()
的路径为/data/data/package_name/files
context.getExternalFilesDir(null)
的私有外部存储空间/storage/emulated/0/Android/data/packagename/files/
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
的公共外部存储空间为/storage/emulated/0/Pictures/
在我的应用程序中,我定义了一个对象,该对象具有时间戳字符串和图像数组(更具体地说,是指向这些图像的路径),并且此信息存储在sqlite数据库中。
但这是个坏主意吗?因为如果有人想将此应用程序移动到另一台设备,路径是否会改变?关于如何移动文件,不同的设备如何影响这种情况等等,我有点困惑。我对在sqlite表中存储图像引用的正确方法感到困惑。你存储像上面这样的绝对路径吗?或者,您是否存储了一个数字,表示该图片是内部/私人外部/公共外部,并且无论设备/文件结构如何都会以此方式拉出来?
我只是想确保我不会发布一个缺乏某些关键功能的应用,因为我误解了一些东西。就像我开始使用可以在内部拍照/存储它们的应用程序一样,它都在内部存储器上,所有这些都在这款手机上。但是,如果我想开始将照片保存到SD卡或其他东西,我必须改变我存储照片的位置以及我如何引用它们。如果我升级手机怎么办?我必须以某种方式将所有这些东西带到/转移到新的基础设施等。或者甚至是“云”。
换句话说,我只是想了解所有可能的用例,这里就Android应用数据的存储和传输方式而言。
答案 0 :(得分:2)
你的问题有点宽泛。我会尝试轮流回答:
但这是个坏主意吗?
不在其中。这里的问题是您如何管理未来可能发生的更改和Android更改(以及您当前支持的版本)
因为如果有人想将此应用移至其他设备,路径是否会发生变化?
相对路径永远不会改变。它们已经实现(我猜测API 2~6),以确保在应用程序中不需要硬盘管理。通过获取Enviroment.getExternalFilesDir(stuffs..)
,无论读取磁盘分配如何,您都会保证指向同一文件的路径。
如何移动文件,不同设备如何影响这种情况等等。
来自桌面(PC,Mac,Linux,Ubuntu等)的文件遵循与Android设备签订的合同,模拟相同的磁盘系统。这样,PC就可以将文件(png,mp3,自定义等)保存在"根文件夹中。成为Enviroment.getExternalFilesDir(stuffs..)
的相同根目录。对应用程序私有的数据永远不可访问(在非根设备上),外部系统。
你存储上面的绝对路径吗?
你可以。但我认为这违背了系统的最佳实践。保存相对路径,然后根据该路径构建File
对象是正确的方法。请注意,Android中的File
类希望您了解一下您正在引用的文件......其扩展名,名称正则表达式,物理位置,关系位置等等...您需要知道至少其中一个。
用户可以在不同的设备中复制相同的内容吗?
为此,您必须确保用户知道"例如,使用Play商店帐户,您可以拥有一个存储库,并让设备与该存储库同步。甚至可以添加一个" export"功能,复制文件,并将其导入其他地方。