07.Swift数据的存储
目录介绍
- 01.存储简单数据类型
- 1.1 UserDefaults介绍
- 1.2 保存和读取数据
- 1.3 检查数据是否存在
- 1.4 如何删除数据
- 1.5 使用场景需说明
- 1.6 数据存储在哪里
- 02.属性列表存储
- 2.1 属性列表存储
- 2.2 列表数据存储实践
- 03.CoreData存储
- 3.1 CoreData是什么
- 3.2 CoreData核心组件
- 3.3 CoreData实践步骤
- 3.4 创建Core Data
- 3.5 创建管理持久化对象
- 3.6 增删改查数据处理
- 3.7 数据处理高级功能
- 04.SQLite数据存储
- 4.1
- 05.File文件存储
- 5.1 文件存储是什么
- 5.2 确定存储路径
- 5.3 创建&删除文件
- 5.4 将数据写入文件
- 5.5 从文件读取数据
- 5.6 存字典的数据
- 06.iOS中沙盒结构
- 6.1 应用沙盒结构分析
01.存储简单数据类型
1.1 UserDefaults介绍
UserDefaults 是一个用于存储和检索应用程序设置和用户偏好的接口。是一个轻量级的存储机制,适用于简单的数据存储需求。
它提供了一种简单的方式来保存和读取小量的数据,例如用户的偏好设置、应用程序的配置信息等。
1.2 保存和读取数据
UserDefaults:存储简单的数据类型,如字符串、数字和布尔值。
let defaults = UserDefaults.standard
//存储数据
defaults.set("John Doe", forKey: "username")
defaults.set(30, forKey: "age")
defaults.set(421125199303111234, forKey: "cardId")
//读取数据
let username = defaults.string(forKey: "username")
let age = defaults.string(forKey: "age")
let cardId = defaults.string(forKey: "cardId")
1.3 检查数据是否存在
使用 object(forKey:) 方法来检查特定键的数据是否存在。如果返回的值不为 nil,则表示数据存在。
if UserDefaults.standard.object(forKey: "username") != nil {
// 数据存在
} else {
// 数据不存在
}
1.4 如何删除数据
使用 removeObject(forKey:) 方法来删除特定键的数据。
UserDefaults.standard.removeObject(forKey: "username")
UserDefaults.standard.removeAll()
1.5 使用场景需说明
UserDefaults 适用于存储小量的数据,例如用户设置和偏好。对于大量或敏感的数据,应该使用其他适当的存储机制,例如数据库或文件系统。
1.6 数据存储在哪里
UserDefaults 使用了一个名为 "UserDefaults.plist" 的文件来保存数据。这个文件通常存储在应用程序的沙盒目录中的 Library/Preferences 文件夹下。
"UserDefaults.plist" 文件是一个二进制文件,您不能直接编辑它。您应该使用 UserDefaults 提供的 API 来读取和写入数据。
由于 "UserDefaults.plist" 文件存储在应用程序的沙盒目录中,它的数据是应用程序私有的,其他应用程序无法直接访问或修改它。
02.属性列表存储
2.1 属性列表存储
每次在Xcode中新建一个iOS项目后,都会自己产生一个.plist文件,里面记录项目的一些配置信息。我们也可以自己创建.plist文件来进行数据的存储和读取。
plist文件存储,存储目录:Documents
属性列表(plist):存储NSArray(数组)、NSDictionary(字典)、NSData、NSString(字符串)、NSNumber(数字)等对象。
一般可以使用属性列表文件存储 NSArray(数组) 或者 NSDictionary(字典) 之类的数据,这种 “属性列表文件” 的扩展名是 plist,因此也称为 “plist 文件”。
plist 是以 xml 文件形式存储的。
2.2 列表数据存储实践
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = path.appendingPathComponent("data.plist")
let data = ["username": "John Doe", "email": "john@example.com"] as NSDictionary
data.write(toFile: filePath.path, atomically: true)
let readData = NSDictionary(contentsOfFile: filePath.path)
PList 数据存储:https://developer.aliyun.com/article/312144
03.CoreData存储
3.1 CoreData是什么
Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象。
Core Data数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型。
3.2 CoreData核心组件
Core Data的主要组件
- 数据模型(Data Model):定义数据的存储结构。
- 托管对象上下文(Managed Object Context):协调数据的创建、查询、更新和删除。
- 托管对象(Managed Object):数据模型中的实体实例。
- 持久化存储协调器(Persistent Store Coordinator):管理数据的存储方式。
- 实体描述(Entity Description):定义实体的属性和关系。
3.3 CoreData实践步骤
使用Core Data进行数据存储的步骤
- 定义数据模型:使用Xcode创建数据模型文件(.xcdatamodeld),定义实体和属性。
- 设置托管对象上下文:在AppDelegate中配置托管对象上下文。
- 创建和查询数据:使用托管对象上下文创建和查询数据。
- 保存上下文:在数据修改后,保存托管对象上下文以更新数据库。
3.4 创建Core Data
创建一个数据模型文件来定义应用程序对象的结构,包括它们的对象类型、属性和关系。
在Xcode中创建一个新的数据模型文件,添加一个名为"User"的实体,包含两个属性:“userName”(字符串类型)和"password"(整数类型)。
3.5 创建管理持久化对象
在 AppDelegate 中创建 NSPersistentContainer
通过 UIApplication 的 shared 实例来获取 AppDelegate 中的上下文(Context)。上下文通常用于 Core Data 框架中的数据操作。
lazy var persistentContainer: NSPersistentContainer = {
//名字和Model.xcdatamodeld一样
let container = NSPersistentContainer(name: "Model")
//本地持久化资源的加载
container.loadPersistentStores { (storeDescription, error) in
if let error = error as NSError? {
//无法加载持久化存储,处理异常
fatalError("Unresolved error \(error), \(error.userInfo)")
}
}
return container
}()
var context: NSManagedObjectContext {
return persistentContainer.viewContext
}
3.6 增删改查数据处理
插入(保存)数据操作
//创建User对象
let user = NSEntityDescription.insertNewObject(forEntityName: "User",
into: context) as! User
//对象赋值
user.id = 1
user.userName = "hangge"
user.password = "1234"
//保存
do {
try context.save()
print("保存成功!")
} catch {
fatalError("不能保存:\(error)")
}
查询数据操作
//声明数据的请求
let fetchRequest = NSFetchRequest<User>(entityName:"User")
fetchRequest.fetchLimit = 10 //限定查询结果的数量
fetchRequest.fetchOffset = 0 //查询的偏移量
//设置查询条件
let predicate = NSPredicate(format: "id= '1' ", "")
fetchRequest.predicate = predicate
//查询操作
do {
let fetchedObjects = try context.fetch(fetchRequest)
//遍历查询的结果
for info in fetchedObjects{
print("id=\(info.id)")
print("username=\(info.userName)")
print("password=\(info.password)")
}
}
catch {
fatalError("不能保存:\(error)")
}
修改数据操作
//声明数据的请求
let fetchRequest = NSFetchRequest<User>(entityName:"User")
fetchRequest.fetchLimit = 10 //限定查询结果的数量
fetchRequest.fetchOffset = 0 //查询的偏移量
//设置查询条件
let predicate = NSPredicate(format: "id= '1' ", "")
fetchRequest.predicate = predicate
//查询操作
do {
let fetchedObjects = try context.fetch(fetchRequest)
//遍历查询的结果
for info in fetchedObjects{
//修改密码
info.password = "abcd"
//重新保存
try context.save()
}
} catch {
fatalError("不能保存:\(error)")
}
删除数据操作
//声明数据的请求
let fetchRequest = NSFetchRequest<User>(entityName:"User")
fetchRequest.fetchLimit = 10 //限定查询结果的数量
fetchRequest.fetchOffset = 0 //查询的偏移量
//设置查询条件
let predicate = NSPredicate(format: "id= '1' ", "")
fetchRequest.predicate = predicate
//查询操作
do {
let fetchedObjects = try context.fetch(fetchRequest)
//遍历查询的结果
for info in fetchedObjects{
//删除对象
context.delete(info)
}
//重新保存-更新到数据库
try! context.save()
}
catch {
fatalError("不能保存:\(error)")
}
3.7 数据处理高级功能
Core Data 还提供了许多其他功能,例如数据关系、数据验证、数据迁移等。
05.File文件存储
5.1 文件存储是什么
文件操作 (NSFileManager):https://developer.apple.com/documentation/foundation/filemanager
5.2 确定存储路径
在Swift中,可以使用FileManager来获取文档目录的路径。我们通常将文件存储在应用的文档目录中,以便于进行读写操作。
// 获取应用的文档目录路径
let fileManager = FileManager.default
if let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
print("Documents Directory: \(documentsDirectory)")
}
- FileManager.default:获取文件管理器的默认实例。
- urls(for:in:):获取指定目录的路径。在这里,我们获取文档目录。
- first:取返回结果的第一个路径。
5.3 创建&删除文件
接下来,我们需要创建一个文件并确定文件名。
// 创建文件名
let fileName = "example.txt"
let filePath = documentsDirectory.appendingPathComponent(fileName)
appendingPathComponent(_😃:将文件名附加到文档目录路径上,形成完整的文件路径。
5.4 将数据写入文件
有了文件路径,就可以开始写入数据了。在此示例中,我们将写入一些简单的文本。
// 要写入的数据
let dataToWrite = "Hello, Swift file storage!"
do {
// 将数据写入文件
try dataToWrite.write(to: filePath, atomically: true, encoding: .utf8)
print("数据成功写入到文件:\(filePath)")
} catch {
print("写入文件时发生错误:\(error)")
}
- write(to:atomically:encoding:):将字符串写入指定路径的文件。
- catch:捕获写入过程中可能发生的错误并进行处理。
5.5 从文件读取数据
do {
// 从文件中读取数据
let readData = try String(contentsOf: filePath, encoding: .utf8)
print("读取的数据是:\(readData)")
} catch {
print("读取文件时发生错误:\(error)")
}
String(contentsOf:encoding:):从指定路径读取数据并将其转换为字符串。
5.6 存字典的数据
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = path.appendingPathComponent("data.plist")
let data = ["username": "John Doe", "email": "john@example.com"] as NSDictionary
//写数据
data.write(toFile: filePath.path, atomically: true)
//读数据
let readData = NSDictionary(contentsOfFile: filePath.path)
NSDictionary(contentsOf:encoding:):从指定路径读取数据并将其转换为字典。
06.iOS中沙盒结构
6.1 应用沙盒结构分析
1、应用程序包:包含了所有的资源文件和可执行文件
2、Documents:保存应用运行时生成的需要持久化的数据
3、tmp:保存应用运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除。
4、Library/Cache:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不备份该目录。一般存放体积大、不需要备份的非重要数据
5、Library/Preference:保存应用的所有偏好设置,IOS的Settings应用会在该目录中查找应用的设置信息。