IOS 数据存储详解及实例代码

IOS 数据存储详解及实例代码

在开发 IOS 应用程序时,数据存储是非常重要的一部分,因为应用程序需要记录用户的信息和应用程序状态。IOS 提供了几种数据存储选项,包括:

  • Property List(属性列表)
  • SQLite 数据库
  • Core Data
  • User Defaults(用户默认设置)
  • NSKeyedArchier

Property List(属性列表)

Property List 是一种序列化的文件格式,可用于存储少量结构化数据,比如字典、数组、字符串和数字。Property List 不支持存储自定义对象。一个简单的例子代码如下:

// 写入数据到 Property List
let dict : [String: Any] = [
    "name" : "John Doe",
    "age": 25,
    "email": "johndoe@example.com"
]
let fileURL = FileManager.default.urls(
    for: .documentDirectory, in: .userDomainMask
)[0].appendingPathComponent("userdata.plist")
try! (dict as NSDictionary).write(to: fileURL)

// 从 Property List 读取数据
let dict = NSDictionary(contentsOf: fileURL) as! [String: Any]
print(dict)

SQLite 数据库

SQLite 是一种轻量级的关系型数据库,可用于存储结构化数据。在 IOS 中使用 SQLite 需要导入 libsqlite3 库,可以使用第三方库 FMDB 简化开发。一个简单的例子代码如下:

// 导入 FMDB 第三方库
import FMDB

// 打开数据库并创建表
let dbURL = FileManager.default.urls(
    for: .documentDirectory, in: .userDomainMask
)[0].appendingPathComponent("userdata.sqlite")
let db = FMDatabase(url: dbURL)
if db.open() {
    let sql = """
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,
        age INTEGER,
        email TEXT
    );
    """
    if !db.executeStatements(sql) {
        print(db.lastErrorMessage())
    }
} else {
    print("Error: \(db.lastErrorMessage())")
}

// 插入数据
let name = "John Doe"
let age = 25
let email = "johndoe@example.com"
let success = db.executeUpdate(
    "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
    withArgumentsIn: [name, age, email]
)
if !success {
    print(db.lastErrorMessage())
}

// 查询数据
let rs = db.executeQuery("SELECT * FROM users", withArgumentsIn: [])
while rs.next() {
    let name = rs.string(forColumn: "name") ?? ""
    let age = rs.int(forColumn: "age")
    let email = rs.string(forColumn: "email") ?? ""
    print("\(name), \(age), \(email)")
}

Core Data

Core Data 是苹果提供的一种对象关系映射(ORM)框架,可以将结果集映射到对象模型中。与 SQLite 相比,Core Data 更加高级和复杂,需要学习一些特定的概念,如实体、属性、关系等。一个简单的例子代码如下:

// 创建 Core Data 上下文
let container = NSPersistentContainer(name: "UserData")
container.loadPersistentStores { storeDescription, error in
    if let error = error {
        print("Error: \(error)")
    }
}
let context = container.viewContext

// 创建一个 User 实体对象并插入到上下文
let user = NSEntityDescription.insertNewObject(
    forEntityName: "User", into: context
) as! User
user.name = "John Doe"
user.age = 25
user.email = "johndoe@example.com"
try! context.save()

// 从 Core Data 查询数据
let request = NSFetchRequest<User>(entityName: "User")
let results = try! context.fetch(request)
for user in results {
    let name = user.name ?? ""
    let age = user.age
    let email = user.email ?? ""
    print("\(name), \(age), \(email)")
}

User Defaults(用户默认设置)

User Defaults 是 IOS 提供的一种轻量级的存储,用于存储少量的用户设置和应用程序状态。User Defaults 是基于 Property List 实现的,只能存储对象、数组和基本数据类型,不支持存储自定义对象。一个简单的例子代码如下:

// 写入数据到 User Defaults
let defaults = UserDefaults.standard
defaults.set("John Doe", forKey: "name")
defaults.set(25, forKey: "age")
defaults.set("johndoe@example.com", forKey: "email")
defaults.synchronize()

// 从 User Defaults 读取数据
let name = defaults.string(forKey: "name") ?? ""
let age = defaults.integer(forKey: "age")
let email = defaults.string(forKey: "email") ?? ""
print("\(name), \(age), \(email)")

NSKeyedArchiver

NSKeyedArchiver 是 IOS 提供的一种序列化和反序列化工具,可以将对象转换为二进制数据并存储到文件中。一个简单的例子代码如下:

// 写入数据到 NSKeyedArchiver
let user = User(name: "John Doe", age: 25, email: "johndoe@example.com")
let data = try! NSKeyedArchiver.archivedData(
    withRootObject: user, requiringSecureCoding: false
)
let fileURL = FileManager.default.urls(
    for: .documentDirectory, in: .userDomainMask
)[0].appendingPathComponent("userdata.dat")
try! data.write(to: fileURL)

// 从 NSKeyedArchiver 读取数据
let data = try! Data(contentsOf: fileURL)
let user = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(
    data
) as! User
print("\(user.name), \(user.age), \(user.email)")

以上就是 IOS 数据存储的详细讲解及实例代码,代码中包含了常用的数据存储方式,可以依据具体情况选择适合自己的方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IOS 数据存储详解及实例代码 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • 网站建设中怎么打造亮点

    以下是“网站建设中怎么打造亮点”的完整攻略: 网站建设中怎么打造亮点? 在网站建设中,打造亮点可以吸引用户的注意力,提高用户的体验和满意度。以下是一些关于如何打造亮点的技巧和步骤,可以帮助用户更好地建设网站。 技巧1:设计独特的页面布局 在网站建设中,设计独特的页面布局可以吸引用户的注意力。用户可以使用不同的颜色、字体、图片等元素来设计页面布局,以便更好地突…

    html 2023年5月18日
    00
  • 如何修改maven默认的JDK版本

    下面是详细讲解“如何修改maven默认的JDK版本”的完整攻略。 1. 确认当前maven使用的JDK版本 在修改maven默认的JDK版本之前,需要先确认当前maven使用的JDK版本。可以通过在终端中执行以下命令来查看: mvn -version 如果输出的结果中包含“Java home”信息,则表示当前maven使用的是该JDK版本。 2. 修改mav…

    html 2023年5月30日
    00
  • 用js动态添加html元素,以及属性的简单实例

    下面是详细的“用js动态添加html元素,以及属性的简单实例”的攻略: 1. 添加HTML元素 在HTML文档中,可以通过Javascript的代码来添加新的HTML元素,达到动态修改页面的目的。下面的例子展示了如何用javascript添加一个新的<div>元素,并将它添加到文档中: // 创建一个div元素 var div = documen…

    html 2023年5月30日
    00
  • Win7系统执行bat批处理文件显示乱码该如何解决?

    针对”Win7系统执行bat批处理文件显示乱码该如何解决?”这个问题,我们可以采取以下几个步骤来解决: 第一步:确认乱码的具体原因 在解决问题之前,需要先弄清楚乱码的具体原因。通常有以下几种情况: 批处理文件本身使用了非UTF-8编码,例如ANSI等; 计算机系统和批处理文件使用不同的编码方式; 输出显示的字体缺失或不支持当前的字符集。 针对以上的情况,我们…

    html 2023年5月31日
    00
  • Android中复制图片的实例代码

    请你先阅读以下完整的攻略: Android中复制图片的实例代码 在Android中,我们可以使用系统剪贴板来复制图片,这里提供一份Android中复制图片的实例代码。 步骤1:添加复制图片权限 在AndroidManifest.xml文件中添加以下权限: <uses-permission android:name="android.permi…

    html 2023年5月31日
    00
  • JS函数修改html的元素内容,及修改属性内容的方法

    关于JS函数修改html元素内容及修改属性内容的方法,我们需要掌握以下知识点: 1. 获取html元素的方法 我们可以通过以下方法获取html元素: 通过id获取:使用document.getElementById()方法。 通过class获取:使用document.getElementsByClassName()方法。 通过标签名获取:使用document…

    html 2023年5月30日
    00
  • Putty登录Ubuntu中文显示乱码怎么办?

    下面是“Putty登录Ubuntu中文显示乱码怎么办?”的完整攻略: 问题描述 当我们使用Putty远程登录Ubuntu服务器后,在控制台输入中文时,经常会出现乱码的情况,这个问题应该如何解决呢? 原因分析 造成这个问题的原因是因为Putty默认的字符集为ASCII,而中文字符集为GB2312,ASCII和GB2312是不一样的字符集,所以当我们在Putty…

    html 2023年5月31日
    00
  • web.xml中servlet, bean, filter, listenr 加载顺序_动力节点Java学院整理

    在Java Web开发中,web.xml是整个Web应用的配置文件,可以在其中配置servlet、filter、listener等组件,以及初始化参数、上下文参数等。这些组件的加载顺序是有规定的,下面进行一一介绍。 Servlet的加载顺序 Servlet是Web应用程序的核心,其加载顺序如下: 1.容器加载web.xml中标签中配置的Servlet类。2.…

    html 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部