ios开发 数据存储

 

首选项设置存储

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属性
  1. #include <sys/xattr.h>
  2. - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
  3. {
  4.     const char* filePath = [[URL path] fileSystemRepresentation];

  5.     const char* attrName = "com.apple.MobileBackup";
  6.     u_int8_t attrValue = 1;

  7.     int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
  8.     return result == 0;
  9. }
复制代码

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

相关变量定义

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

  1. – archiver:didEncodeObject:
  2. – archiverDidFinish:
  3. – archiver:willEncodeObject:
  4. – archiverWillFinish:
  5. – 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:
  1. – unarchiver:cannotDecodeObjectOfClassName:originalClasses:
  2. – unarchiver:didDecodeObject:
  3. – unarchiver:willReplaceObject:withObject:
  4. Finishing Decoding
  5. – unarchiverDidFinish:
  6. – 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,记得保存。结束过程示例:
  1. NSManagedObjectContext *managedObjectContext = nil;
  2. // 得到模版
  3. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"YOUR_XCDATAMODELD_FILE_NAME" withExtension:@"momd"];
  4. NSManagedObjectModel* managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  5. // 具体文件,DOCUMENT_DICRECTORY应该是nsurl的..
  6. NSURL *storeURL = [@"DOCUMENT_DICRECTORY" URLByAppendingPathComponent:@"SQLITE.sqlite"];
  7. NSError *error = nil;
  8. NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
  9. // 使用SQLite存储
  10. if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

  11. // 出错
  12. }
  13. else
  14. {
  15. // 得到操作空间
  16. managedObjectContext = [[NSManagedObjectContext alloc] init];
  17. [managedObjectContext setPersistentStoreCoordinator:coordinator];
  18. }

  19. // 得到具体的表
  20. NSEntityDescription *entityDescription = [NSEntityDescription
  21. entityForName:@"ONE_ENTITY_NAME"
  22. inManagedObjectContext:managedObjectContext];
  23. // 操作语句
  24. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  25. [request setEntity:entityDescription];
  26. // 操作语句的条件
  27. NSPredicate *pred = [NSPredicate predicateWithFormat:@"PREDICATE_SECTION"];
  28. [request setPredicate:pred];

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

  32. if (objects == nil) {
  33. // 出错

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

  45. [request release];
  46. // 保存,结束
  47. [managedObjectContext save:&error];
复制代码
(四).SQLite
引入SQLite库,加入头文件,使用C API操作.繁琐的地方在于只能存储c数据格式,需要来回转换.过程示例:
  1. // 声明数据库
  2. sqlite3 *database;
  3. // 打开
  4. if (sqlite3_open("数据库文件路径", &database) != SQLITE_OK) {
  5. sqlite3_close(database);
  6. // 出错
  7. }

  8. char *errorMsg;
  9. // 执行无返回语句
  10. if (sqlite3_exec (database, "增删改创语句",NULL, NULL, &errorMsg) != SQLITE_OK) {
  11. sqlite3_close(database);
  12. // 出错
  13. }
  14. sqlite3_stmt *statement;
  15. // 执行查询语句
  16. if (sqlite3_prepare_v2(database, "查询语句",-1, &statement, nil) == SQLITE_OK) {
  17. // 遍历结果
  18. while (sqlite3_step(statement) == SQLITE_ROW) {
  19. int row = sqlite3_column_int(statement, 0);
  20. // 第一列数据
  21. char *rowData = (char *)sqlite3_column_text(statement, 1);
  22. }
  23. // 结束遍历
  24. sqlite3_finalize(statement);
  25. }
  26. // 关闭数据库
  27. sqlite3_close(database);
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学生管理系统 (难度系数*****) 使用下面的数据,设计一个简单的学籍管理系统,实现出最基本的功能。 学生基本信息文件(a.txt)及其内容:事先提供,格式如下 学号 姓名 性别 宿舍号码 电话号码 01 李成成 男 501 87732111 02 李成华 女 101 87723112 03 王成凤 女 101 87723112 04 张明明 男 502 87734333 05 陈东 男 501 87732111 06 李果 男 502 87734333 07 张圆圆 女 102 87756122 。。。。。。。。。 学生成绩基本信息文件(b.txt)及其内容: 学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分 01 A01 大学物理 3 66 78 82 02 B03 高等数学 4 78 -1 90 01 B03 高等数学 4 45 -1 88 02 C01 VF 3 65 76 66 ``````````````` (一)功能要求及说明: (1) 数据录入功能:对b.txt进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据,综合成绩、实得学分由程序根据条件自动运算。 综合成绩的计算:如果本课程的实验成绩为-1,则表示本课程无实验,综合成绩=平时成绩*30%+卷面成绩*70%;如果实验成绩不为-1,表示本课程有实验,综合成绩=平时成绩*15%+实验成绩*15%+卷面成绩*70%。 实得学分的计算:采用等级学分制。 综合成绩在90-100之间,应得学分=学分*100% 综合成绩在80-90之间,应得学分=学分*80% 综合成绩在70-80之间,应得学分=学分*75% 综合成绩在60-70之间,应得学分=学分*60% 综合成绩在60以下,应得学分=学分*0% (2)查询功能:分为学生基本情况查询和成绩查询两种 A:学生基本情况查询: A1---输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。 A2---输入一个宿舍号码,可查询本室所有的学生的基本信息并显示输出。 B:成绩查询: B1:输入一个学号时,查询出此生的所有课程情况,格式如下: 学号 :XX 姓名: XXXXXXXX 课程编号: 课程名称: 综合成绩: 实得学分: 学号 :XX 姓名: XXXXXXXX 课程编号: 课程名称: 综合成绩: 实得学分: 学号 :XX 姓名: XXXXXXXX 课程编号: 课程名称: 综合成绩: 实得学分: 学号 :XX 姓名: XXXXXXXX 课程编号: 课程名称: 综合成绩: 实得学分: ``````````````````````````` 共修:XX科,实得总学分为:XXXX (2) 删除功能:当在a.txt中删除一个学生时,自动地在b.txt中删除此人所有信息。 (3) 排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据
文件存储在Swift iOS开发中是一个重要的主题。Swift提供了多种方法来进行文件存储和管理。其中一种常见的方法是使用沙盒机制。沙盒是每个iOS应用程序的独立文件系统,每个应用程序都有自己的文件目录,其他应用程序无法访问其中的文件。 在iOS中,常见的文件存储方式包括: 1. 用户文档目录(Documents Directory):用于存储用户生成的数据,例如用户创建的文件或下载的内容。这些文件会被自动备份到iCloud,并在需要时可以从其他设备访问。可以使用`FileManager`类的`urls(for:in:)`方法获取该目录的URL。 2. 应用程序支持文件目录(Application Support Directory):用于存储应用程序的数据文件,例如数据库文件和配置文件。这些文件不会被自动备份到iCloud。可以使用`FileManager`类的`urls(for:in:)`方法获取该目录的URL。 3. 缓存目录(Caches Directory):用于存储临时数据,例如网络请求的缓存文件。这些文件不会被自动备份到iCloud,可能会在系统需要释放存储空间时被删除。可以使用`FileManager`类的`urls(for:in:)`方法获取该目录的URL。 4. 临时目录(Temporary Directory):用于存储临时文件,例如在应用程序运行期间创建的临时文件。这些文件可能会在应用程序终止后自动被删除。可以使用`FileManager`类的`temporaryDirectory`属性获取该目录的URL。 此外,还可以使用`UserDefaults`类来进行轻量级的数据存储,例如存储用户的偏好设置。 在SwiftUI中,还可以使用`FileImporter`修改器方法来将Files App中的文件导入到应用程序中。这个功能是从SwiftUI 2.0开始引入的,可以方便地将文件导入到应用程序中进行处理。 总之,Swift提供了多种方法来进行文件存储和管理,开发者可以根据具体需求选择适合的方法来处理文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SwiftUI 实现一个 iOS 上 Files App 兼容的文件资源管理器](https://blog.csdn.net/mydo/article/details/130714434)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值