读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作
ios中数据持久化存储方式一般有5种:NSUserDefault、对象归档(NSKeyedArchiver)、文件操作、数据库存储(SQLite3)、CoreData。
1、NSUserDefault用于保存程序相关的偏好设置和配置数据等,以便下次启动程序后能恢复上次的设置。
NSUserDefault和对象归档
//通过单利来创建一个NSUserDefaults对象,全局变量NSUserDefault,可在整个项目传递变量
let userDefault:NSUserDefaults = NSUserDefaults.standardUserDefaults() //通过init方法创建
let userDefault1:NSUserDefaults = NSUserDefaults(suiteName: "SwiftClass")!
print(userDefault1.dictionaryRepresentation()) //获取userDefault单利下所有的值
print(userDefault.dictionaryRepresentation()) //判断NSUserDefaults的“appMessage”key 在dictionaryRepresentation中是否存在,如果不存在就设置“appMessage”值为This is app message。
if(userDefault.objectForKey("message") == nil){
userDefault.setObject("This_is_my_default_message", forKey: "message")
} //如果想单独看某个key的设置,例如:
let dic = userDefault.dictionaryRepresentation()
let object_one:AnyObject? = (dic as NSDictionary).objectForKey("AppleKeyboards")
// //或者
// var object_one:AnyObject? = dic["AppleKeyboards"] if let oValue: AnyObject! = object_one {
print(oValue)
} //Int类型
//设置
userDefault.setInteger(, forKey: "Int")
//读取
let intValue = userDefault.integerForKey("Int")
print(intValue) //Float类型
//设置
userDefault.setFloat(3.2, forKey: "Float")
//读取
let floatValue = userDefault.floatForKey("Float")
print(floatValue) //Double类
//设置
userDefault.setDouble(5.6890, forKey: "Double")
//读取
let doubleValue = userDefault.doubleForKey("Double")
print(doubleValue) //Bool类型
//设置
userDefault.setBool(true, forKey: "Bool")
//读取
let boolValue = userDefault.boolForKey("Bool")
print(boolValue) //NSURL类型
//设置
userDefault.setURL(NSURL(string: "http://www.iphonetrain.com")!, forKey: "NSURL")
//读取
let urlValue = userDefault.URLForKey("NSURL")
print(urlValue)
//保存NSDate数据
//将对象转换成NSData流
let imageData:NSData = NSKeyedArchiver.archivedDataWithRootObject(UIImage(named: "SwiftClassWeiXin.png")!) //存储NSData对象
userDefault.setObject(imageData, forKey: "imageData") //读取数据
//获取NSData
let objData:AnyObject? = userDefault.objectForKey("imageData") //还原对象-初始一个UIImage对象
let myImage:AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithData(objData as! NSData) print(myImage)
//自定义的类实现存取需要通过NSData做载体 //创建AppsModel的实例
let model = AppsModel(imageName: "appIcon2.png", app_Name: "租房点评", app_Description: "租房被骗?现在开始,你来改变这一切!《租房点评》为你而备,租房无忧!") //实例对象转换成NSData
let modelData:NSData = NSKeyedArchiver.archivedDataWithRootObject(model) //存储NSData对象
userDefault.setObject(modelData, forKey: "myAppModel")
//保存NSString,
userDefault.setValue("1_NSString", forKey: "NSString")
userDefault.setObject("1_NSString1", forKey: "NSString1") //保存NSNumber,
let number:NSNumber = NSNumber(int: )
userDefault.setValue(number, forKey: "number")
userDefault.setObject(number, forKey: "number1") //保存NSArray
let array1:NSArray = NSArray(array:["",""])
userDefault.setValue(array1, forKey: "array")
userDefault.setObject(array1, forKey: "array1") //保存NSDictionary
let dictionary:NSDictionary = NSDictionary(dictionary: ["":""])
userDefault.setValue(dictionary, forKey: "dictionary")
userDefault.setObject(dictionary, forKey: "dictionary1")
var value:AnyObject? = userDefault.valueForKey("dictionary")
print(value) value = userDefault.objectForKey("dictionary1")
print(value) //-------- 删除所有的值
let ar:NSDictionary = userDefault.dictionaryRepresentation() for key in ar.allKeys { userDefault.removeObjectForKey(key as! String) userDefault.synchronize()//内存中数据同步更新数据库
}
2、文件操作
应用开发中所有的非代码文件都存储在沙盒中。
//1、获取程序的Home目录
let homeDirectory = NSHomeDirectory()
print(homeDirectory) //2、获取Documents目录
let documentPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) let documentPath = documentPaths[]
print(documentPath) //或通过home目录自己追加文件夹
let documentPath2 = homeDirectory + "/Documents"
print(documentPath2) //3、获取Library目录
let libraryPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let libraryPath = libraryPaths[]
print(libraryPath) //或通过home目录自己追加文件夹
let libraryPath2 = homeDirectory + "/Library"
print(libraryPath2) //4、获取Cache目录
let cachesPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let cachesPath = cachesPaths[]
print(cachesPath) //或通过home目录自己追加文件夹
let cachesPath2 = homeDirectory + "/Library/Caches"
print(cachesPath2) //5、获取Tmp目录
let tmpDir = NSTemporaryDirectory()
print(tmpDir) //或通过home目录自己追加文件夹
let tmpDir2 = homeDirectory + "/tmp"
print(tmpDir2)
对文件操作需要先创建一个文件管理器
// 创建文件管理器
let fileManager :NSFileManager = NSFileManager.defaultManager()
//创建目录
//定义几个自己的目录
let myDirectory1:String = NSHomeDirectory() + "/Documents/myFolder/Images"
let myDirectory2:String = NSHomeDirectory() + "/Documents/myFolder/Films"
let myDirectory3:String = NSHomeDirectory() + "/Documents/myFolder/Musics"
let myDirectory4:String = NSHomeDirectory() + "/Documents/myFolder/Files" //创建目录
//withIntermediateDirectories 设置成true,代表中间所有的路径目录如果不存在,都会创建
//如果设置成false,因为myFolder目录不存在,所以无法创建1234目录 //创建myDirectory1目录
do
{
try fileManager.createDirectoryAtPath(myDirectory1, withIntermediateDirectories: true, attributes: nil)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
} //创建myDirectory2目录
do
{
try fileManager.createDirectoryAtPath(myDirectory2, withIntermediateDirectories: true, attributes: nil)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
} //创建myDirectory3目录
do
{
try fileManager.createDirectoryAtPath(myDirectory3, withIntermediateDirectories: true, attributes: nil)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
} //创建myDirectory4目录
do
{
try fileManager.createDirectoryAtPath(myDirectory4, withIntermediateDirectories: true, attributes: nil)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
}
Swift 的错误处理机制要求你必须使用 do-catch 语句来捕获所有的错误并处理他们。
//创建文件
let filePath = myDirectory1 + "/appInfo.txt"
let info = "经常听到:被中介骗了,押金不退,晚一天交房租,被讹了。租房普遍现象:网上报价不真实?经常被忽悠!(看房时报价都比网上高!)证件不齐全,被骗过!(其实根本不是房东啦!)看房前态度都很热情! 签约之后态度骤变!入住后家电维修只能靠自己! 房屋到期,押金各种被勒索!现在开始,你来改变这一切!《租房点评》为你而备,租房无忧!再也不用担心被欺骗,想要知道给你介绍房子的人好不好,《租房点评》告诉你!"
通过writeToFile方法,将一些对象写入到文件中
do
{
try info.writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
}
//保存图片
let image = UIImage(named: "SwiftClassWeiXin@3x.png")
let data:NSData = UIImageJPEGRepresentation(image!, 1.0)!
let data1:NSData = UIImagePNGRepresentation(image!)!
data.writeToFile(myDirectory1 + "/SwiftClassIcon.jpg", atomically: true)
data1.writeToFile(myDirectory1 + "/SwiftClassIcon.png", atomically: true) //保存NSArray
let array = NSArray(objects: "","","")
array.writeToFile(myDirectory4 + "/array.plist", atomically: true) //保存NSDic
let dictionary = NSDictionary(objects: ["","",""], forKeys: ["","",""])
dictionary.writeToFile(myDirectory4 + "/dictionary.plist", atomically: true)
//判断目录或文件是否存在
let exist = fileManager.fileExistsAtPath(filePath)
print(exist) //移动
let filePath2 = myDirectory4 + "/appInfo.txt"
do
{
try fileManager.moveItemAtPath(filePath, toPath: filePath2)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
} //重命名
//通过移动该文件对文件重命名
let filePath3 = myDirectory4 + "/appInfo2.txt"
do
{
try fileManager.moveItemAtPath(filePath2, toPath: filePath3)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
} //拷贝
let filePath4 = myDirectory4 + "/appInfoCopy.txt"
do
{
try fileManager.copyItemAtPath(filePath3, toPath: filePath4)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
}
//获取目录列里所有文件名
//先拷贝一些文件到myDirectory4目录下
let filePath00 = myDirectory4 + "/appInfoCopy00.txt"
let filePath11 = myDirectory4 + "/appInfoCopy11.txt"
let filePath22 = myDirectory4 + "/appInfoCopy22.txt"
do
{
try fileManager.copyItemAtPath(filePath3, toPath: filePath00)
try fileManager.copyItemAtPath(filePath3, toPath: filePath11)
try fileManager.copyItemAtPath(filePath3, toPath: filePath22)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
}
//获取所有文件
let fileArray = fileManager.subpathsAtPath(myDirectory4)
print(fileArray)
// Optional([appInfo.txt, appInfo2.txt, appInfoCopy.txt, appInfoCopy00.txt, appInfoCopy11.txt, appInfoCopy22.txt]) //iPhone中获取文件各项属性方法
//获取文件属性
do
{
var fileAttributes : [NSObject:AnyObject]? = try NSFileManager.defaultManager().attributesOfItemAtPath(filePath22) //获取文件的创建日期
let modificationDate:AnyObject? = fileAttributes![NSFileModificationDate]
print(modificationDate) //获取文件的字节大小
let fileSize:AnyObject? = fileAttributes![NSFileSize]
print(fileSize)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
}
//删除文件
do
{
try fileManager.removeItemAtPath(filePath4)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
} //删除目录下所有文件
//方法1: 获取所有文件,然后遍历删除
let fileArray2 : [AnyObject]? = fileManager.subpathsAtPath(myDirectory4)
for fn in fileArray2!
{
do
{
try fileManager.removeItemAtPath(myDirectory4 + "/\(fn)")
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
}
} //方法2:删除目录后重新创建该目录
do
{
try fileManager.removeItemAtPath(myDirectory4)
try fileManager.createDirectoryAtPath(myDirectory4, withIntermediateDirectories: true, attributes: nil)
}
catch let error as NSError {
print(error)//如果创建失败,error 会返回错误信息
}
}
读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作的更多相关文章
- iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver
IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...
- ios数据存储——对象归档
归档:数据从内存与闪存相互转化,类似“序列化”,将数据转换成二进制字节数据 操作:有两种方式,第一种是单个对象作为root进行归档和恢复,一个对象一个文件:第二种,可以同时归档多个对象到一个文件 注意 ...
- IOS数据持久化之归档NSKeyedArchiver
IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data ...
- 读写应用程序数据-CoreData
coreData数据最终的存储类型可以是:SQLite数据库.XML.二进制.内存里.自定义的数据类型. 和SQLite区别:只能取出整个实体记录,然后分解,之后才能得到实体的某个属性. 1.创建工程 ...
- RandomAccessFile(),读写文件数据的API,以及复制文件操作
package seday03;import java.io.File;import java.io.RandomAccessFile; import java.io.IOException; /** ...
- Visual Studio 控制台应用程序 同时使用OpenCV和matlab mat文件操作
matalb具有灵活的图像处理,代码编写起来简洁而高效.而OpenCV具有很多成熟的计算机视觉算法,能够处理很多实时的识别处理等问题,而且代码运行起来效率很高.所以如何结合两者之间的优点,是让很多学术 ...
- IOS数据持久化之归档NSKeyedArchiver, NSUserDefaults,writeToFile
//2.文件读写 //支持:NSString, NSArray , NSDictionay, NSData //注:集合(NSArray, NSDictionay)中得元素也必须是这四种类型, 才能够 ...
- 读写应用程序数据-SQLite3
SQLite3是嵌入到ios中的关系型数据库.对存储大规模的数据非常实用,使得不必将每个对象加到内存中. 支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串和文本).BLOB(二进制 ...
- iOS数据存储之对象归档
iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...
随机推荐
- 应付配置文件 Profile
(N) System Administrator > Profile > System Profile Option Name Site Application Responsibilit ...
- 获取Mac、CPUID、硬盘序列号、本地IP地址、外网IP地址OCX控件
提供获取Mac.CPUID.硬盘序列号.本地IP地址.外网IP地址OCX控件 开发语言:vc++ 可应用与WEB程序开发应用 <HTML><HEAD><TITLE> ...
- Qt: The State Machine Framework 学习
State Machine,即为状态机,是Qt中一项非常好的框架.State Machine包括State以及State间的Transition,构成状态和状态转移.通过状态机,我们可以很方便地实现很 ...
- 使用 ASR 和 Azure Pack 为 IaaS 工作负荷提供托受管 DR
Ashish Gangwar 云 + Enterprise项目经理 几周前,我们宣布了在 Azure Site Recovery 中提供一些新功能,这些新功能适用于不同场景,可以让服务提供商在 A ...
- AlarmManager用法
源http://blog.csdn.net/wangxingwu_314/article/details/8060312
- 【JS】Intermediate7:jQuery:DOM API
1.jQuery also makes performing actions on many elements at the same time simple 2.eg:$('.note').css( ...
- linux驱动程序之电源管理之Run-time PM 详解(4)
Run-time PM. 每个device或者bus都会向run-time PM core注册3个callback struct dev_pm_ops { ... int (*runtime_su ...
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- java 小结3 hashcode和equals I/o问题
我需要把星期天看的一些东西记录下来,要不然会忘记. hashCode.equals: 1)每个java对象都有hashCode和equals方法. java的终极类是object类,那么object类 ...
- POJ-3207 Ikki's Story IV - Panda's Trick 2sat
题目链接:http://poj.org/problem?id=3207 题意:在一个圆圈上有n个点,现在用线把点两两连接起来,线只能在圈外或者圈内,现给出m个限制,第 i 个点和第 j 个点必须链接在 ...