demo开发技巧iOS

数据存储方式、沙盒路径、FMDB

2016-07-30  本文已影响475人  CoderZb

沙箱模型的有四个文件夹


documents,tmp,app,Library。

四个文件夹分别是什么


Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。

tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。

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

Library 目录:这个目录下有两个子目录:Caches 和 Preferences

Library/Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.(利用NSUserDefaults存储的数据就是在沙盒中的这个文件夹中)

Library/Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。

沙盒中各个目录的路径获取方式


1.获取沙盒中home目录(主目录,沙盒的最外层)的路径
    NSString *homeDir = NSHomeDirectory();

    NSLog(@"获取沙盒中home目录路径\n %@",homeDir);
打印结果
  2016-06-17 21:12:06.264 sd[9698:422028] 获取沙盒中home目录路径

 /Users/zhangbin/Library/Developer/CoreSimulator/Devices/46A6D7C4-D373-4684-A640-4B4A1FF2BC6E/data/Containers/Data/Application/5E081742-A012-48E6-B70A-77906491B714

2.获取沙盒中Documents目录的路径
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *docDir = [paths objectAtIndex:0];

    NSLog(@"获取沙盒中Documents目录的路径\n %@",docDir);
打印结果:
    2016-06-17 21:12:06.264 sd[9698:422028] 获取沙盒中Documents目录的路径

     /Users/zhangbin/Library/Developer/CoreSimulator/Devices/46A6D7C4-D373-4684-A640-4B4A1FF2BC6E/data/Containers/Data/Application/5E081742-A012-48E6-B70A-77906491B714/Documents

3.获取沙盒中Caches目录的路径

    NSArray *path2 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

    NSString *cachesDir = [path2 objectAtIndex:0];

    NSLog(@"获取沙盒中Caches目录的路径\n %@",cachesDir);
打印结果:
    2016-06-17 21:12:06.264 sd[9698:422028] 获取沙盒中Caches目录的路径
   /Users/zhangbin/Library/Developer/CoreSimulator/Devices/46A6D7C4-D373-4684-A640-4B4A1FF2BC6E/data/Containers/Data/Application/5E081742-A012-48E6-B70A-77906491B714/Library/Caches

4.获取沙盒中tmp目录的路

     NSString *tmpDir = NSTemporaryDirectory();
     NSLog(@"获取沙盒中tmp目录的路径\n %@",tmpDir);

打印结果:

2016-06-17 21:12:06.265 sd[9698:422028] 获取沙盒中tmp目录的路径

 /Users/zhangbin/Library/Developer/CoreSimulator/Devices/46A6D7C4-D373-4684-A640-4B4A1FF2BC6E/data/Containers/Data/Application/5E081742-A012-48E6-B70A-77906491B714/tmp/


NSUserDefaults详细介绍



NSUserDefaults六大方法:


一.得到共享的NSUserDefaults实例

+ (NSUserDefaults *)standardUserDefaults    

二.初始化一个NSUserDefaults对象

- (id)initWithUser:(NSString *)username

三.得到默默认值

- objectForKey:;

- stringForKey:;

- arrayForKey:;

- dictionaryForKey:;

- dataForKey:;

- stringArrayForKey:;

- integerForKey:;

- floatForKey:;
- doubleForKey:;

- boolForKey:;

- URLForKey:;

四.设置默认值

- setInteger:forKey:;

- setFloat:forKey:;

- setDouble:forKey:;

- setBool:forKey:;

- setURL:forKey:;

五.记录默认值

- registerDefaults:;

六.删除默认值

- removeObjectForKey:;

如何使用NSUserDefaults?


你可以把它当做是一个小型的数据库,在存储和读取数据之前,你需要调用方法: standardUserDefaults :
如:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

我把这个方法理解为,打开数据库的大门,这样你就可以对里面的数据做各种操作,也可以将存储数据进来。
存储数据和读取数据有各种方法,需要注意的是,存储数据需要完成方法 synchronize:,这个方法完成的作用是同步数据,也就是将你做出改变的数据更新。
如:

[defaults synchronize];

NSUserDefaults具体用法



1.获取 NSUserDefaults

这是一个单例,获取非常方便,随时可以调用:

[NSUserDefaults standardUserDefaults];

2.写入数据到NSUserDefaults中

[[NSUserDefaults standardUserDefaults] setInteger:10 forKey:@"test"];

[[NSUserDefaults standardUserDefaults] setFloat:10.0 forKey:@"test"];

..... NSUserDefaults 支持多种数据类型,用 key来标示

3.读取NSUserDefaults中存储的数据

 int a = [[NSUserDefaults standardUserDefaults] integerForKey:@"test"];

 float a = [[NSUserDefaults standardUserDefaults] floatForKey:@"test"];

 。。。当然也支持其他各种类型

4.保存数据,实现持久化存储

[[NSUserDefaults standardUserDefaults] synchronize];

5.判断数据是否存在

 if([[NSUserDefaults standardUserDefaults] objectForKey:@""test"]==nil){
  ......
}else{
  ......
}

NSUserDefaults和Property List(属性表,也就是plist文件)区别




如何获取利用NSUserDefaults存储数据的路径?

iOS中数据存储方式

// 向plist文件中存数据
 NSArray *data = @[@"Marry",@"Lucy"];
 [data writeToFile:@"/Users/zhangbin/Desktop/zhangbin.plist" atomically:YES];

// 再次向这个plist文件中存数据时,首先必须得取出这个plist中的数据,然后再添加数据,最后才可以写入到plist文件
 NSMutableArray *data = [NSMutableArray arrayWithContentsOfFile:@"/Users/zhangbin/Desktop/zhangbin.plist"];
[data addObject:@"Tom"];
[data writeToFile:@"/Users/zhangbin/Desktop/zhangbin.plist" atomically:YES];

精华demo

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong)NSDictionary *Dic;
@property(nonatomic,strong)NSMutableDictionary *sectionDic;
@end

@implementation ViewController

-(NSDictionary *)Dic{
    if(_Dic == nil){
        _Dic = [NSDictionary dictionary];
    }
    return _Dic;
}
-(NSMutableDictionary *)sectionDic{
    if(_sectionDic == nil){
        _sectionDic = [NSMutableDictionary dictionary];
    }
    return _sectionDic;
}

// 例2:复杂测试
- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSMutableArray * sectionArr = [[NSMutableArray alloc] init];
    NSMutableDictionary * rowDic = [[NSMutableDictionary alloc] init];
    
    for (int i = 0; i < 2; i ++) {
        
        for (int j = 0; j < 4; j ++) {
            
            [rowDic setObject:@"NO" forKey:@"selected"];// 等价rowDic[@"selected"]=@"NO";
            [sectionArr addObject:rowDic];
        }
        // 总结:key不能为NSNumber,key只能为字符串。 value可以为字符串,也可以为NSNumber
        // [self.sectionDic setObject:sectionArr forKey:@(i)];// 错误写法
        
        // 正确写法
        [self.sectionDic setObject:sectionArr forKey:[NSString stringWithFormat:@"%zd",i]];// 等价 self.sectionDic[ [NSString stringWithFormat:@"%zd",i]] = sectionArr;
    }
    
    /*****************************写plist文件到本地路径*****************************/
    BOOL a = [self.sectionDic writeToFile:@"/Users/zhangbin/Desktop/Company/zb6.plist" atomically:YES];
    if (a == 1) {
        NSLog(@"写入成功");
    }else{
        NSLog(@"写入失败");
    }
    NSLog(@"%@",self.sectionDic);
    
    /*****************************写plist文件到沙盒********************************/
    // 获取沙盒中Documents目录的路径
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *plistPath1 = [paths objectAtIndex:0];
    //拼接plist文件,得到完整的文件名
    NSString *filename = [plistPath1 stringByAppendingPathComponent:@"CoderZb.plist"];
    // 打印plist文件的总路径
    NSLog(@"%@",filename);
    [self.sectionDic writeToFile:filename atomically:YES];
    // 打印读取plist文件
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filename];
    // 打印plist文件中的内容
    NSLog(@"%@",dict);

}

// 例1:简单测试
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    // 总结:key不能为NSNumber,key只能为字符串。 value可以为字符串,也可以为NSNumber
    //    NSDictionary *dict3=@{@"a":@"b",@"c":@"d"};// 写入成功
    //    NSDictionary *dict3=@{@(1):@"b",@"c":@"d"};// 写入失败
    NSDictionary *dict3=@{@"a":@(2),@"c":@"d"};// 写入成功
    [dict3 writeToFile:@"/Users/zhangbin/Desktop/Company/zhangbin.plist"  atomically:YES];

}

@end
打印。.png 写入到plist文件.png
// 将NSString 对象存储到 NSUserDefaults 中
  NSString *passWord = @"1234567";
 NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  [user setObject:passWord forKey:@"userPassWord"];

// 从NSUserDefaults中取出数据,只需要取出key 对应的值就好了  
  NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
  NSString *passWord = [ user objectForKey:@"userPassWord"];

    /************toFile和unarchiveObjectWithFile的参数为字符串类型的路径*********************/

    NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:@"A",@"B", @"C",@"D",nil];
  
    NSString *path =  [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"glossary.archive"];
 
  // 归档时,toFiled的参数写成路径。解档时,objectForKey的参数也必须写成路径

  // 使用NSKeyedArchiver归档
    [NSKeyedArchiver archiveRootObject:glossary toFile:path];
    NSLog(@"%@",path);
 
  // 使用NSKeyedUnarchiver解档
    NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

    for(NSString *key in readglossary){
        NSLog(@"%@: %@",key,[readglossary objectForKey:key]);
    }

        

    /************toFile和unarchiveObjectWithFile的参数仅仅是普通的字符串*********************/

    // dictionaryWithObjectsAndKeys的参数特殊,从冒号开始,@"A"为键,@"B"为值,以此类推
 NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:@"A",@"B", @"C",@"D",nil];

  
  // 归档时,toFiled的参数写成字符串.那么解档时,objectForKey的参数也必须写成字符串
    [NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];

  // 将文件glossary.archive中的数据读到字典对象并显示出来
    NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];

    for(NSString *key in readglossary){
        NSLog(@"%@: %@",key,[readglossary objectForKey:key]);
    }


方式3打印结果:

2016-06-17 20:09:12.430 1[7975:345839] B: A

2016-06-17 20:09:12.432 1[7975:345839] D: C

2016-06-17 20:09:12.432 1[7975:345839] E: E


SQLite3是数据库技术,纯C语言版本,是轻量级

Core Data是数据库技术,以SQLite3为基础的OC版本,且是重量级

数据库



使用sqlite3报错的解决办法


92-01.png

归档、解档


92-05.png 92-06.png

注意归档\解档 和 对象转成NSData数据\将NSData数据转成对象的区别


 [NSKeyedArchiver archiveRootObject:shops toFile:@"/Users/apple/Desktop/shops.data"];
 NSMutableArray *shops = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/user/xxx"];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:shop];
ZBShop *shop = [NSKeyedUnarchiver unarchiveObjectWithData:data];

用SDWebImage清除图片缓存功能


    NSArray *path2 =                     NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesDir = [path2 objectAtIndex:0];
    NSLog(@"获取沙盒中Caches目录的路径\n %@",cachesDir);
59-41.gif

封装一个分类:根据文件夹路径,计算文件夹的大小



利用SDWebImage清除图片缓存和利用NSFileManager清除图片缓存


1.利用SDWebImage清除图片缓存.

[[SDImageCache sharedImageCache] clearDisk];

2.利用NSFileManager清除图片缓存

NSFileManager *mgr = [NSFileManager defaultManager];

    // 缓存路径

    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

    // 删除removeItemAtPath参数中的Caches目录下的文件

    [mgr removeItemAtPath:caches error:nil];

总结:


图片缓存和视频、音频缓存默认的存储路径


上一篇 下一篇

猜你喜欢

热点阅读