经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
ios应用数据存储方式(XML属性列表-plist) - 转
来源:cnblogs  作者:久依  时间:2018/12/13 10:41:06  对本文有异议

 

一.ios应用常用的数据存储方式 
  1.plist(XML属性列表归档) 
  2.偏好设置 
  3.NSKeydeArchiver归档(存储自定义对象) 
  4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆分存储) 
  5.Core Data(对象型的数据库,把内部环节屏蔽)

应用沙盒 
每个ios应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其它文件系统隔离。应用必须待在自己到沙盒里,其他应用不能访问该沙盒(提示:在ios8中已经开发访问)。 
应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer) 

模拟器应用用沙盒的根路径在: (apple是用用户名,模拟器版本9.4.1)

/Users/apple/Library/Developer/CoreSimulator/Devices/CCBBF90E-03CE-4B92-827F-345635A6CD7E/data/Containers/Data/Application/30EF0702-4062-40F9-B82C-974679878206

 

应用沙盒结构分析  应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件。 
1) Documents:保存应用运行时生成的需要持久性的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。 
2) tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录 
3) Library 目录:这个目录下有两个子目录:Caches 和 Preferences
  Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大,不需要备份的非重要数据。 
  Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。

4) AppNameApp 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。 

 

四.应用沙盒常见的获取方式 
  1.沙盒根目录:NSString *home = NSHomeDirectory();  Documents目录两种方法

  1. NSString *homeDir = NSHomeDirectory();

  2.利用沙盒根目录拼接”Documents”字符串 

  1. NSString *home = NSHomeDirectory();
  2. NSString *documents = [home stringByAppendingPathComponent:@”Documents”];//不建议采用,因为新版本的操作系统可能会修改目录名

  3.利用 NSSearchPathForDirectoriesInDomains 函数 

  1. //NSUserDomainMask代表从用户文件下找
  2. //YES代表展开路径中的波浪字符”~”
  3. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);//在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素
  4. NSString *documents = [array objectAtIndex:0];

  4. 获取 tmp 目录 

  1. NSString *tmp = NSTemporaryDirectory();

  5.Library/Caches:(跟Documents类似的2种方法) 

  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  2. NSString *cachesDir = [paths objectAtIndex:0];

  6.利用沙盒根目录拼接”Caches”字符串 

  7.利用 NSSearchPathForDirectoriesInDomain 函数(将函数的2个参数改为:NSCachesDirectory即可) 

  8.Library/Preference:通过 NSUserDefaults 类存取该目录下的设置信息 

  9.获取应用程序程序包中资源文件路径的方法: 例如获取程序包中一个图片资源(apple.png)路径的方法:

  1. NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple ofType:@”png”];
  2. UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

  代码中的mainBundle类方法用于返回一个代表应用程序包的对象。


代码:

  1. #define CURRENT_SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
  2. #define CURRENT_SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height - 64)
  3. #define BUTTON_WIDTH 80
  4. #define BUTTON_HEIGHT 40
  5.  
  6. @interface ViewController ()
  7. //保存数据按钮
  8. @property(nonatomic,strong) UIButton *saveButton;
  9. //读取数据按钮
  10. @property(nonatomic,strong) UIButton *readButton;
  11. @end
  12.  
  13. @implementation ViewController
  14. - (void)viewDidLoad {
  15. [super viewDidLoad];
  16. [self initControl];
  17. }
  18. - (void)didReceiveMemoryWarning {
  19. [super didReceiveMemoryWarning];
  20. // Dispose of any resources that can be recreated.
  21. }
  22. //初始化控件
  23. - (void)initControl{
  24. _saveButton = [[UIButton alloc] initWithFrame:CGRectMake(CURRENT_SCREEN_WIDTH/2 - BUTTON_WIDTH/2,
  25. CURRENT_SCREEN_HEIGHT/2 - BUTTON_HEIGHT,
  26. BUTTON_WIDTH,
  27. BUTTON_HEIGHT)];
  28. [_saveButton setTitle:@"保存数据" forState:UIControlStateNormal];
  29. [_saveButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  30. [_saveButton addTarget:self
  31. action:@selector(saveClick)
  32. forControlEvents:UIControlEventTouchUpInside];
  33. [self.view addSubview:_saveButton];
  34. _readButton = [[UIButton alloc] initWithFrame:CGRectMake(CURRENT_SCREEN_WIDTH/2 - BUTTON_WIDTH/2,
  35. _saveButton.frame.origin.y + _saveButton.frame.size.height + 60,
  36. BUTTON_WIDTH,
  37. BUTTON_HEIGHT)];
  38. [_readButton setTitle:@"读取数据" forState:UIControlStateNormal];
  39. [_readButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  40. [_readButton addTarget:self
  41. action:@selector(readClick)
  42. forControlEvents:UIControlEventTouchUpInside];
  43. [self.view addSubview:_readButton];
  44. }
  45. - (void)saveClick{
  46. //获取应用程序目录
  47. NSString *home = NSHomeDirectory();
  48. NSLog(@"应用程序目录:%@",home);
  49. //NSUserDomainMask在用户目录下查找
  50. //YES 代表用户目录的~
  51. //NSDocumentDirectory查找Documents文件夹
  52. //建议使用如下方法动态获取
  53. NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
  54. NSUserDomainMask,
  55. YES) lastObject];
  56. NSLog(@"Documents文件夹路径:%@",doc);
  57. //拼接文件路径
  58. NSString *path = [doc stringByAppendingString:@"/abc.plist"];
  59. //NSArray *array = @[@"ios",@"23"];
  60. //[array writeToFile:path atomically:YES];
  61. //NSDictionary *dict = @{@"name":@"ios",@"age":@"28"};
  62. //[dict writeToFile:path atomically:YES];
  63.  
  64. /*
  65. plist只能存储系统自带的一些常规的类,也就是有writeToFile方法的对象才可以使用plist保持数据
  66. 字符串/字典/数据/NSNumber/NSData ...
  67. */
  68.  
  69. //自定义的对象不能保存到plist中
  70. DBPerson *person = [[DBPerson alloc] init];
  71. person.name = @"ios";
  72. }
  73. - (void)readClick{
  74. NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
  75. NSUserDomainMask,
  76. YES) lastObject];
  77. NSString *path = [doc stringByAppendingString:@"/abc.plist"];
  78. //读取数据
  79. //NSArray *array = [NSArray arrayWithContentsOfFile:path];
  80. //NSLog(@"%@",array);
  81. //NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
  82. //NSLog(@"name = %@",[dict objectForKey:@"name"]);
  83. //NSLog(@"age = %@",[dict objectForKey:@"age"]);
  84. }
  85. @end

 

五.属性列表 
  1.属性列表是一种XML格式的文件,拓展名为plist。 
  2.如果对象是NSString,NSDictionary,NSArray,NSData,NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中 

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号