美文网首页程序员IOS
Sandbox的一些相关内容

Sandbox的一些相关内容

作者: 新南12138 | 来源:发表于2016-09-26 14:11 被阅读150次

    域(Domain)

    user defaults 数据库中其实是由多个层级的域组成的,当你读取一个键值的数据时,NSUserDefaults从上到下透过域的层级寻找正确的值,不同的域有不同的功能,有些域是可持久的,有些域则不行。

    • NSArgumentDomain (参数域): 有最高的优先权,在这里设置的参数可以覆盖其他地方设置的参数.
    • ApplicationDomain (应用域):最重要的域,它存储着你app通过NSUserDataults set...forKey添加的设置.
    • NSGlobalDomain (全局域) :存储着系统的设置
    • Languages - Specific Domain (语言域): 包括地区、日期等
    • NSRegistrationDomain (参数域) : 仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。

    注:这些域的优先级顺序是从上到下.

    iOS Sandbox

    对于一个iOS 程序来说,系统给它提供一个容器,用来存储自己的信息.
    每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问其他应用的应用沙盒.(也有例外,比如在用户授权情况下访问通讯录,相册等)

    沙盒目录结构

    沙盒结构
    • App Bundle: 包含所有资源文件和可执行文件

    • Documents: 保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录

    • tmp: 保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除,应用没有运行时,系统也可能会自动清理该目录下的文件,iTunes不会同步该目录,iPhone重启时该目录下的文件会丢失。

    • Libaray: 存储程序的默认设置和其他状态信息,iTunes会自动备份该目录。

    • Libaray/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除,一般存放体积比较大,不是很重要的资源

    • Libaray/Preferences:保存应用的所有偏好设置,ios的Settings(设置)应用会在该目录中查找应用的设置信息,iTunes会自动备份该目录。

    怎样获取文件路径

    iOS设备中每个文件都有路径,这指的是文件在文件系统中的准确位置.要让应用程序能够读写器沙盒中的文件,需要指定该文件的完整路径.

    Core Foundation提供了一个名为NSSearchDirectoriesInDomains的C语言函数,他返回指向应用程序的目录Documents或Library/Caches的路径.该函数可以返回多个目录,因此该函数的返回结果是一个NSArray对象.使用该函数来访问指定目录Documents或Library/Caches的路径时,它返回的数组将只包含一个NSString.

    // 获取沙盒主目录路径
     NSString *homeDir = NSHomeDirectory();
     // 获取Documents目录路径 
      NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) firstObject];
     // 获取Library的目录路径
      NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
     // 获取Caches目录路径
      NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
      // 获取tmp目录路径
       NSString *tmpDir = NSTemporaryDirectory();
    

    读写数据

    NSFileManager是一个单列类,也是一个文件管理器。可以通过NSFileManager创建文件夹、创建文件、写文件、读文件内容等等基本功能。

    这里有一篇我觉得写得挺好的: http://www.jianshu.com/p/64b673ba551b
    就不再啰嗦了

    SQLite

    想和大家分享一些新手入门写得SQLite的数据库简单操作

    我在这里使用的是第三方的库:FMDB.不说废话直接上代码
    这是一个用FMDB后写得简单的数据库操作的类

    AddressBookDataBase.h 文件
      #import <FMDB/FMDB.h>
    
      #import <Foundation/Foundation.h>
    
      @interface AddressBookDataBase : NSObject
      -(void)openDataBase:(FMDatabase *)DataBase;
      -(FMDatabase *)createdDataBase;
      -(void)closeDataBase:(FMDatabase *)DataBase;
      -(void)insertDatatoDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name  phoneNumberIs: (NSString *) phoneNumber;
      -(void)deleteDataFromDataBase:(FMDatabase *)DataBase nameIs:    (NSString *) name;
      -(void)modificationDataFromDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name phoneNumberIs: (NSString *) phoneNumber originalName:(NSString *)originalName;
      -(void)deleteTableFromDataBase:(FMDatabase *)DataBase table:(NSString *)tableName;
    
      @end
    
    AddressBookDataBase.m 文件
     #import "AddressBookDataBase.h"
    
     @implementation AddressBookDataBase
     -(FMDatabase *)createdDataBase{
        //创建打开数据库
         NSString * strPath = [NSHomeDirectory() stringByAppendingString:@"/Documents/AddressList.db"];
         NSLog(@"%@",strPath);
         FMDatabase * db = [FMDatabase databaseWithPath:strPath];
         if (db != nil) {
              NSLog(@"数据库创建成功");
             }
         return db;
       }
    
     -(void)openDataBase: (FMDatabase *)DataBase{
          BOOL isOpen = [DataBase open];
          if (isOpen) {
          NSLog(@"打开数据库成功");
         }
       }
    
    -(void)closeDataBase: (FMDatabase *)DataBase{
        BOOL isClose = [DataBase close];
        if (isClose) {
            NSLog(@"关闭数据库成功");
        }
       }
    
    -(void)insertDatatoDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name  phoneNumberIs: (NSString *) phoneNumber {
      NSString * strCreateTable = @"create table if not exists addressList(id integer  primary key autoincrement,name varchar(20),phoneNumber varchar(20));";
    //如果执行成功  返回YES
      BOOL isCreate = [DataBase executeUpdate:strCreateTable];
    
      if(isCreate == YES){
        NSLog(@"创建数据表成功");
       }
    
       NSString * strInsert = [NSString stringWithFormat:@"insert into addressList values(NULL,'%@','%@');",name,phoneNumber];
       NSLog(@"%@",strInsert);
    
      BOOL isOK = [DataBase executeUpdate:strInsert];
      if (isOK == YES) {
          NSLog(@"插入数据成功");
      }
    
     }
    
    -(void)deleteDataFromDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name{
      NSString * strDelete = [NSString stringWithFormat:@"delete from addressList where name = '%@'",name];
      NSLog(@"%@",strDelete);
      BOOL isOK = [DataBase executeUpdate:strDelete];
      if(isOK == YES){
        NSLog(@"删除成功");
      }
    
    }
    -(void)modificationDataFromDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name phoneNumberIs: (NSString *) phoneNumber originalName:(NSString *)originalName{
    
      NSString* strModification = [NSString stringWithFormat:@"update addressList set phoneNumber = '%@', name = '%@' where name = '%@';",phoneNumber,name,originalName];
      NSLog(@"%@",strModification);
    
      BOOL isOk = [DataBase executeUpdate:strModification];
      if(isOk ==YES){
          NSLog(@"修改表成功!");
      }
    }
    
    -(void)deleteTableFromDataBase:(FMDatabase *)DataBase table:(NSString *)tableName{
       NSString* strDeleteTable = [NSString stringWithFormat:@"drop table %@",tableName];
       BOOL isOk = [DataBase executeUpdate:strDeleteTable];
       if(isOk ==YES){
        NSLog(@"删除表成功!");
        }
      }
    
     @end
    

    关于sqlite的一些语法的问题,这里给大家推荐一个网站
    http://www.runoob.com/sqlite/sqlite-update.html.
    里面关于SQLite的语句有详细的语法讲解,希望可以帮到大家.

    总结

    关于Domain的操作 实际上就是简单的数据存储操作.有时候人家说Domain 你可能不知道是什么意思.查查字典,Google 会知道的.而Domain又分了很多个Domain.所以很容易就弄混了.你需要知道这些Domain之间的区别.

    关于NSSearchDirectoriesInDomains该函数的返回值是一个NSString的数组.
    这个函数有个domainMask,这里只举出NSUserDomainMask.的情况.如果这里的参数写的是这个NSUserDomainMask.但是该数组将只有一个NSString对象.返回的就是你在NSHomeDirectory下查找Documents/Library文件夹的路径.所以使用的时候直接用下标访问就可以了.其他的请查阅NSSearchDirectoriesInDomainsAPI的说明

    相关文章

      网友评论

        本文标题:Sandbox的一些相关内容

        本文链接:https://www.haomeiwen.com/subject/gtkqyttx.html