标签(空格分隔): iOS沙盒 iOS数据库 iOS归档
说到iOS持久化技术,务必先看一下苹果官方的iOS Data Storage Guidelines,苹果对iOS各种不同的应用数据存储目录做了详细规定,有英文阅读能力的建议去阅读原文。英文不好的,就看我的翻译吧,虽然可能不是很准确,这也是我建议去阅读原文的原因。 以下为译文:
为了保证尽可能高效地备份数据,请按照以下标准来存储你的应用数据:
1.只有用户使用生成的文档、其他数据或者是应用程序无法重新创建的数据才应该保存在< Application_Home >/Documents目录下,这些数据会自动备份到iCloud;
2.可以重新下载或生成的数据应该存储在< Application_Home >/Library/Caches文件夹下。比如你应该把作为缓存的数据库文件、下载的内容保存在/Library/Caches文件夹下,杂志、报纸和地图使用的数据就属于这一类。
3.只是暂时使用的数据应该存储在< Application_Home > / tmp目录中。当你使用完这些数据,要记得删除,虽然它们没有备份到iCloud,这样才不会继续占用用户设备的存储空间。
4.使用"do not back up"属性来指定需要保留在设备中的文件,即使在存储空间所剩无几的情况下。那些能够重新生成但在存储空间所剩无几时仍需要保留,对应用程序的正常运行有影响,或用户希望在离线时仍可用的文件就用这个属性。所有文件都可以使用这个属性,不论在哪个文件夹下,包括Documents目录。这些文件不会被清理掉,也不会被添加进iTunes或iCound的备份中。这些文件会一直占用着用户设备的存储空间,你的应用要负责监控和定期清理这些文件。
##一、应用沙盒
沙盒目录结构如图:
- Documents 这个文件夹地下存储的是关键数据,关键数据在存储不够用时也会保留,并且会被iTunes或iCloud备份。只有用户生成的文件、应用程序不能重新创建的文件才应该保存在此目录。如果你把应用程序下载大文件,图片和视频保存在此目录,那么你的应用程序会被拒绝发布。 如果你的应用程序启用了iTunes文件分享功能,用户就可以在iTunes中看到目录内容(以及子目录),还可以更新文件。
启用分享功能方法:为Info.plist文件添加键值:"Application supports iTunes file sharing","YES"
- Library 用来存储不想共享给用户的文件。需要时你可以创建自己的子目录。
Library/Caches 这个文件夹存储的是缓存数据,iTunes和iClou不会备份这些数据。缓存数据是可以重新生成或下载的数据 Library/Preferences 用于存储应用程序偏好设置的plist文件,
- tmp 供应用程序存储临时文件。iTunes和iCloud不会备份该目录,系统可能会清空该目录下的数据(重新启动就会清理),在不需要这些文件时,应用程序要及时删除tmp中的文件,以免占用文件系统的空间。
#pragma mark - 获取沙盒Documents的文件目录
+ (NSString *)getDocumentsDirectory{
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES) lastObject];
}
#pragma mark - 获取沙盒Library的文件目录
+ (NSString *)getLibraryDirectory{
return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES) lastObject];
}
#pragma mark - 获取沙盒Caches的文件目录
+ (NSString *)getCachesDirectory{
return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask, YES) lastObject];
}
#pragma mark - 获取沙盒Preference的文件目录
+ (NSString *)getPreferencePanesDirectery{
return [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory,
NSUserDomainMask, YES) lastObject];
}
#pragma mark - 获取沙盒tmp的文件目录
+ (NSString *)getTmpDirectory{
return NSTemporaryDirectory();
}
#pragma mark - 得到指定目录下的所有文件
+ (double)sizeWithFilePath:(NSString *)filePath{
//1.获得文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
//2.检测路径是否合理
BOOL dir = NO;
if (![manager fileExistsAtPath:filePath isDirectory:&dir]) {
return 0;
};
if (dir) {//如果是文件夹就要遍历该目录下的所有文件
NSArray *subpaths = [manager subpathsAtPath:filePath];
int totalSize = 0;
for (NSString *subPath in subpaths) {
NSString *fullsubpath = [filePath stringByAppendingPathComponent:subPath];
BOOL dir = NO;
[manager fileExistsAtPath:fullsubpath isDirectory:&dir];
if(!dir){//如果子路径是个文件
NSDictionary *attrs = [manager attributesOfItemAtPath:fullsubpath error:nil];
totalSize +=[attrs[NSFileSize] intValue];
}
}
return totalSize/(1024*1024.0);
}else{
NSDictionary *attrs = [manager attributesOfItemAtPath:filePath error:nil];
return [attrs[NSFileSize] intValue] / (1024*1024.0);
}
}
#pragma mark - 得到指定目录下的所有文件
+ (NSArray *)getAllFileNames:(NSString *)directoryPath{
return [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:directoryPath error:nil];
}
#pragma mark - 删除指定目录或者文件
+ (BOOL)clearFilesWithFilePath:(NSString *)path{
return [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}
#pragma mark - 清空指定目录下文件
+ (BOOL)clearFilesFromDirectoryPath:(NSString *)directoryPath{
NSArray *fileArray = [self getAllFileNames:directoryPath];
BOOL isDeleteFilesSucess = NO;
for (NSString *fileName in fileArray) {
NSString *filePath = [directoryPath stringByAppendingPathComponent:fileName];
isDeleteFilesSucess = [self clearFilesWithFilePath:filePath];
if (!isDeleteFilesSucess) {
break;
}
}
return isDeleteFilesSucess;
}
复制代码