zoukankan      html  css  js  c++  java
  • 数据存储小结

    首选项设置存储

    NSUserDefaults 以及通过它控制的SettingBundle  NSUserDefaults 用来保存一些设置,他会自动写到何时的位置。
    NSUbiquitousKeyValueStore 多平台同步设置,限制是大小64k,开启entitlement,唯一Apple ID(还要考虑无法连接到iCloud网络时的情形)

    文件存储
    一.目录描述
    <Application_Home>/AppName.app bundle目录,包括程序本身。往里面些东西会导致签名改变和重启程序。初始同步后iTunes不备份此目录。
    <Application_Home>/Documents/ 存储用户文档和程序数据。通过文件共享可以使其可见。iTunes备份之。
    <Application_Home>/Documents/Inbox 其他程序要求本程序打开的文档。可读删,不可增加修改。要改变可以先移出来。iTunes备份之。
    <Application_Home>/Library/ 非用户数据文件存储的根目录。用其中标准或自定义的文件夹备份不被用户可见的数据。不应用这个目录存储用户数据。iTunes备份之。
      ~Library/Application Support/<bundle_ID> 为用户创建管理的资源和数据文件。用这个目录存储程序状态信息,下载的文件甚至用户创建但同意你管理的数据。自动保存文件。
      ~/Library/Caches/<bundle_ID> 用来存储缓存文件或者程序可以简单重建的文件的目录。
    <Application_Home>/tmp/ 临时文件目录,可能被系统删除,不应期望始终存在。不被iTunes备份。
    另:

    离线数据
    可以下载,或重新创建,但用户希望在离线时也能访问这些数据。存放在<Application_Home>/Documents 或<Application_Home>/Library/Private Documents ,并标记为"do not backup"。这两个位置的数据在低存储空间时都会保留,而"do not backup"属性会阻止iTunes或iCloud备份。应用不再需要离线数据文件时,应该尽快删除,以避免浪费用户的存储空间。
    设置do not back up属性
    #include <sys/xattr.h>
    - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
    {
        const char* filePath = [[URL path] fileSystemRepresentation];
    
        const char* attrName = "com.apple.MobileBackup";
        u_int8_t attrValue = 1;
    
        int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
        return result == 0;
    }
    

    得到目录地址
    URLsForDirectory:inDomains: method 返回NSURL形式的目录地址
    NSSearchPathForDirectoriesInDomains 返回字符串形式的目录地址
    NSHomeDirectory 返回程序根目录
    NSTemporaryDirectory 返回临时文件目录

    相关变量定义

    NSSearchPathDirectory
    enum {
    NSApplicationDirectory = 1,//Supported applications (/Applications)
    NSDemoApplicationDirectory,//Unsupported applications and demonstration versions
    NSDeveloperApplicationDirectory,//Developer applications (/Developer/Applications)
    NSAdminApplicationDirectory,//System and network administration applications
    NSLibraryDirectory,//Various user-visible documentation, support, and configuration files (/Library)
    NSDeveloperDirectory,//Developer resources (/Developer)
    NSUserDirectory,//User home directories (/Users)
    NSDocumentationDirectory,//
    NSDocumentDirectory,//
    NSCoreServiceDirectory,//Location of core services (System/Library/CoreServices)
    NSAutosavedInformationDirectory = 11,//Location of user’s autosaved documents Library/Autosave Information
    NSDesktopDirectory = 12,//
    NSCachesDirectory = 13,//Location of discardable cache files (Library/Caches)
    NSApplicationSupportDirectory = 14,//Location of application support files (Library/Application Support)
    NSDownloadsDirectory = 15,//
    NSInputMethodsDirectory = 16,//
    NSMoviesDirectory = 17,//
    NSMusicDirectory = 18,//
    NSPicturesDirectory = 19,//
    NSPrinterDescriptionDirectory = 20,//
    NSSharedPublicDirectory = 21,//
    NSPreferencePanesDirectory = 22,//
    NSItemReplacementDirectory = 99,//
    NSAllApplicationsDirectory = 100,//
    NSAllLibrariesDirectory = 101//
    };
    typedef NSUInteger NSSearchPathDirectory;
    enum {
    NSUserDomainMask = 1,//用户主目录中
    NSLocalDomainMask = 2,//当前机器中
    NSNetworkDomainMask = 4,//网络中可见的主机
    NSSystemDomainMask = 8,//系统目录,不可修改(/System)
    NSAllDomainsMask = 0x0ffff,//全部
    };
    typedef NSUInteger NSSearchPathDomainMask;

    二.存储方式

    (一).属性列表(plist)
    array,dictionary,data,string,NSNumber,NSDate 等ns对象直接写入plist文件中保存.
    (二).归档文件
    实现NSCoding协议(NSCopy也要实现?没实现也成功了。。)

    编解码类说明

    NSKeyedArchiver

    创建
    - (id)initForWritingWithMutableData:(NSMutableData *)data // 归档数据写到data中
    归档数据
    + (NSData *)archivedDataWithRootObject:(id)rootObject // 归档到data中
    + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path // 归档到文件中
    - (void)finishEncoding // 调用后不能继续归档数据,归档结束必须调用(公共方法归档的不用理这个了)
    – outputFormat // data编码方式,xml还是二进制
    – setOutputFormat:
    编码数据
    – encodeBool:forKey:
    – encodeBytes:length:forKey:
    – encodeConditionalObject:forKey:
    – encodeDouble:forKey:
    – encodeFloat:forKey:
    – encodeInt:forKey:
    – encodeInt32:forKey:
    – encodeInt64:forKey:
    – encodeObject:forKey:
    代理委托
    – delegate
    – setDelegate:

    – archiver:didEncodeObject:
    – archiverDidFinish:
    – archiver:willEncodeObject:
    – archiverWillFinish:
    – archiver:willReplaceObject:withObject:

    类和类名
    + setClassName:forClass:
    + classNameForClass:
    – setClassName:forClass:
    – classNameForClass:
    异常
    extern NSString *NSInvalidArchiveOperationException;

    NSKeyedUnarchiver

    创建
    – initForReadingWithData:
    取消归档
    + (id)unarchiveObjectWithData:(NSData *)data // 从data中得到实现归档的对象
    + (id)unarchiveObjectWithFile:(NSString *)path // 从文件中得到
    解码数据
    - (BOOL)containsValueForKey:(NSString *)key // 是否包含给定的key编码对象
    – decodeBoolForKey:
    – decodeBytesForKey:returnedLength:
    – decodeDoubleForKey:
    – decodeFloatForKey:
    – decodeIntForKey:
    – decodeInt32ForKey:
    – decodeInt64ForKey:
    – decodeObjectForKey:
    - (void)finishDecoding // 通知委托解码结束,调用后不能再继续解码
    代理委托
    – delegate
    – setDelegate:

    – unarchiver:cannotDecodeObjectOfClassName:originalClasses:
    – unarchiver:didDecodeObject:
    – unarchiver:willReplaceObject:withObject:
    Finishing Decoding
    – unarchiverDidFinish:
    – unarchiverWillFinish:

    类名
    + setClass:forClassName:
    + classForClassName:
    – setClass:forClassName:
    – classForClassName:
    异常
    NSString *NSInvalidUnarchiveOperationException;


    (三).CoreData
    xcdatamodeld文件中Entity的三种属性:
    Attributes: 对应的Obj-c类的接口变量.
    Relationships: Entity之间的关系,to-one,or to-many.
    Fetched properties: 对上面Relationship的过滤?参考参考1

    对应文件存储形式

    COREDATA_EXTERN NSString * const NSSQLiteStoreType NS_AVAILABLE(10_4, 3_0);// SQLite形式存储
    COREDATA_EXTERN NSString * const NSXMLStoreType NS_AVAILABLE(10_4, NA);// ios不可用
    COREDATA_EXTERN NSString * const NSBinaryStoreType NS_AVAILABLE(10_4, 3_0);// 二进制形式存储
    COREDATA_EXTERN NSString * const NSInMemoryStoreType NS_AVAILABLE(10_4, 3_0);// 内存中

    基本使用过程(括号中参考sql术语)
    NSManagedObjectModel对象 获取工程中xcdatamodeld文件设置的模版(就是你的数据库有哪些表,表中有哪些字段的一种说明)
    NSPersistentStoreCoordinator对象 根据上面的模版生成或对应的一个文件(数据库文件,具体的数据文件)
    NSManagedObjectContext对象 上面文件的操作的空间,增删改查都通过这里进行
    NSEntityDescription对象 得到上面context中的一个表
    NSFetchRequest对象 对上面表的一些具体操作,增删改查
    - (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error; 使用这个方法执行上面的request
    如果增删改了context,记得保存。结束

    过程示例:

    NSManagedObjectContext *managedObjectContext = nil;
    // 得到模版
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"YOUR_XCDATAMODELD_FILE_NAME" withExtension:@"momd"];
    NSManagedObjectModel* managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    // 具体文件,DOCUMENT_DICRECTORY应该是nsurl的..
    NSURL *storeURL = [@"DOCUMENT_DICRECTORY" URLByAppendingPathComponent:@"SQLITE.sqlite"];
    NSError *error = nil;
    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
    // 使用SQLite存储
    if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

    // 出错
    }
    else
    {
    // 得到操作空间
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator:coordinator];
    }

    // 得到具体的表
    NSEntityDescription *entityDescription = [NSEntityDescription
    entityForName:@"ONE_ENTITY_NAME"
    inManagedObjectContext:managedObjectContext];
    // 操作语句
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];
    // 操作语句的条件
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"PREDICATE_SECTION"];
    [request setPredicate:pred];

    NSManagedObject *manageObject = nil;
    // 执行操作,得到多条具体数据
    NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];

    if (objects == nil) {
    // 出错

    }
    if ([objects count] > 0)
    // 多条,取第一条
    manageObject = [objects objectAtIndex:0];
    else
    // 没有相应的,就创建
    manageObject = [NSEntityDescription
    insertNewObjectForEntityForName:@"TABLE_NAME"
    inManagedObjectContext:managedObjectContext];
    // 改变她的一个字段的值
    [manageObject setValue:@"VALUE" forKey:@"ONE_FIELD_NAME_OF_THE_TABLE"];

    [request release];
    // 保存,结束
    [managedObjectContext save:&error];


    (四).SQLite
    引入SQLite库,加入头文件,使用C API操作.繁琐的地方在于只能存储c数据格式,需要来回转换.

    过程示例:

    // 声明数据库
    sqlite3 *database;
    // 打开
    if (sqlite3_open("数据库文件路径", &database) != SQLITE_OK) {
    sqlite3_close(database);
    // 出错
    }

    char *errorMsg;
    // 执行无返回语句
    if (sqlite3_exec (database, "增删改创语句",NULL, NULL, &errorMsg) != SQLITE_OK) {
    sqlite3_close(database);
    // 出错
    }
    sqlite3_stmt *statement;
    // 执行查询语句
    if (sqlite3_prepare_v2(database, "查询语句",-1, &statement, nil) == SQLITE_OK) {
    // 遍历结果
    while (sqlite3_step(statement) == SQLITE_ROW) {
    int row = sqlite3_column_int(statement, 0);
    // 第一列数据
    char *rowData = (char *)sqlite3_column_text(statement, 1);
    }
    // 结束遍历
    sqlite3_finalize(statement);
    }
    // 关闭数据库
    sqlite3_close(database);

    参考1:http://stackoverflow.com/questions/2985054/what-exactly-is-a-fetched-property

  • 相关阅读:
    经典之计算机内存管理
    Git 远程仓库
    【玩转微信公众平台之十】 图文消息回复解说
    C++11中的继承构造函数
    树莓派使用无线网卡上网相关命令
    swift的UITableView的使用
    相似微信的ChattingUi
    HDOJ 5289 Assignment 单调队列
    poj1936
    samba 文件和目录权限控制
  • 原文地址:https://www.cnblogs.com/v2m_/p/2245726.html
Copyright © 2011-2022 走看看