HarmonyOS 数据持久化对比iOS 数据持久化对比

227 阅读5分钟

一、轻量级键值存储

1. HarmonyOS - Preferences

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    dataPreferences.getPreferences()获取 Preferences 实例(异步)let prefs = await dataPreferences.getPreferences(context, 'myPrefs');
    prefs.put()写入键值对(内存缓存,未持久化)await prefs.put('theme', 'dark');
    prefs.flush()手动触发内存数据持久化到磁盘await prefs.flush();
    prefs.get()读取键值对(优先从内存读取)let theme = await prefs.get('theme', 'light');
    prefs.delete()删除指定键值await prefs.delete('token');
  • 使用场景

    // 示例:保存用户主题设置  
    async function saveTheme(theme: string) {  
      let prefs = await dataPreferences.getPreferences(context, 'user_settings');  
      await prefs.put('theme', theme);  
      await prefs.flush(); // 立即保存  
    }  
    

2. iOS - UserDefaults

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    UserDefaults.standard获取 UserDefaults 单例let defaults = UserDefaults.standard
    defaults.set(_:forKey:)写入键值对(自动延迟持久化)defaults.set("dark", forKey: "theme")
    defaults.synchronize()已废弃(iOS 12+ 自动同步,无需调用)defaults.synchronize()
    defaults.object(forKey:)读取任意类型数据let theme = defaults.object(forKey: "theme") as? String ?? "light"
    defaults.removeObject(forKey:)删除指定键值defaults.removeObject(forKey: "token")
  • 使用场景

    // 示例:保存用户主题设置  
    func saveTheme(theme: String) {  
      UserDefaults.standard.set(theme, forKey: "theme")  
      // iOS 12+ 无需调用 synchronize()  
    }  
    

二、文件存储

1. HarmonyOS - File API

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    fs.open()打开文件(指定路径和模式,如读写/创建)`let file = await fs.open(path, fs.OpenMode.READ_WRITEfs.OpenMode.CREATE);`
    fs.write()写入数据到文件描述符await fs.write(file.fd, "Hello".buffer);
    fs.read()从文件描述符读取数据let buffer = new ArrayBuffer(1024); await fs.read(file.fd, buffer);
    fs.close()关闭文件描述符fs.close(file.fd);
    fs.access()检查文件是否存在let exists = await fs.access(path);
  • 场景示例

    // 保存用户日志到沙箱文件  
    async function saveLog(log: string) {  
      let dir = globalThis.context.filesDir;  
      let path = `${dir}/app.log`;  
      let file = await fs.open(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);  
      await fs.write(file.fd, log.buffer);  
      fs.close(file.fd);  
    }  
    

2. iOS - FileManager

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    FileManager.default.urls(for:in:)获取沙箱目录路径(如 Documents、Caches)let url = FileManager.default.urls(for: .documentDirectory, .userDomainMask).first!
    url.appendingPathComponent()拼接文件路径let fileURL = url.appendingPathComponent("data.txt")
    data.write(to:options:)写入数据到文件(原子性写入可选)try data.write(to: fileURL, options: .atomic)
    FileManager.default.contents(atPath:)读取文件数据let data = FileManager.default.contents(atPath: fileURL.path)
    FileManager.default.removeItem(at:)删除文件try FileManager.default.removeItem(at: fileURL)
  • 场景示例

    // 保存文本到 Documents 目录  
    func saveText(text: String) {  
      let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!  
      let fileURL = dir.appendingPathComponent("note.txt")  
      try? text.data(using: .utf8)?.write(to: fileURL, options: .atomic)  
    }  
    

三、关系型数据库

1. HarmonyOS - RDB

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    dataRDB.getRdbStore()创建或打开数据库let rdbStore = await dataRDB.getRdbStore(context, config, version);
    rdbStore.executeSql()执行 SQL 语句(如建表、插入)await rdbStore.executeSql("CREATE TABLE IF NOT EXISTS user (id INT)");
    rdbStore.insert()插入数据到指定表await rdbStore.insert("user", { id: 1, name: "Alice" });
    RdbPredicates构建查询条件(链式调用)let predicates = new RdbPredicates("user").equalTo("name", "Alice");
    rdbStore.query()执行查询并返回结果集let resultSet = await rdbStore.query(predicates, ["id", "name"]);
  • 场景示例

    // 查询用户列表  
    async function queryUsers() {  
      let predicates = new dataRDB.RdbPredicates('user');  
      predicates.greaterThan("age", 18);  
      let resultSet = await rdbStore.query(predicates, ['id', 'name']);  
      while (resultSet.goToNextRow()) {  
        let id = resultSet.getLong(resultSet.getColumnIndex('id'));  
        let name = resultSet.getString(resultSet.getColumnIndex('name'));  
      }  
    }  
    

2. iOS - Core Data

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    NSPersistentContainer初始化 Core Data 容器(管理上下文和存储)let container = NSPersistentContainer(name: "UserModel")
    NSManagedObjectContext获取上下文(执行增删改查)let context = container.viewContext
    NSFetchRequest创建查询请求let request: NSFetchRequest<User> = User.fetchRequest()
    NSPredicate构建查询条件request.predicate = NSPredicate(format: "age > %d", 18)
    context.save()保存上下文变更到数据库try context.save()
  • 场景示例

    // 查询年龄大于 18 的用户  
    func fetchAdultUsers() {  
      let request: NSFetchRequest<User> = User.fetchRequest()  
      request.predicate = NSPredicate(format: "age > %d", 18)  
      let users = try? context.fetch(request)  
    }  
    

四、敏感数据加密存储

1. HarmonyOS - 安全存储

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    cryptoFramework.createCipher()创建加密算法实例(如 AES-GCM)`let cipher = cryptoFramework.createCipher('AES256GCMPKCS7');`
    cipher.init()初始化加密模式(需传入密钥)await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, key);
    cipher.doFinal()执行加密/解密操作let encrypted = await cipher.doFinal(data.buffer);
    cryptoFramework.createSymKeyGenerator()生成对称密钥let generator = cryptoFramework.createSymKeyGenerator('AES256');
  • 场景示例

    // 加密用户密码  
    async function encryptPassword(password: string) {  
      let generator = cryptoFramework.createSymKeyGenerator('AES256');  
      let key = await generator.generateSymKey();  
      let cipher = cryptoFramework.createCipher('AES256|GCM|PKCS7');  
      await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, key);  
      let encrypted = await cipher.doFinal(new Uint8Array(password.buffer));  
      return encrypted;  
    }  
    

2. iOS - Keychain Services

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    SecItemAdd(_:_:)添加条目到 KeychainSecItemAdd(query as CFDictionary, nil)
    SecItemCopyMatching(_:_:)查询 Keychain 条目SecItemCopyMatching(query as CFDictionary, &result)
    SecItemUpdate(_:_:)更新 Keychain 条目SecItemUpdate(query as CFDictionary, attributesToUpdate as CFDictionary)
    SecItemDelete(_:)删除 Keychain 条目SecItemDelete(query as CFDictionary)
  • 场景示例

    // 保存密码到 Keychain  
    func savePassword(password: String, for user: String) {  
      let query: [String: Any] = [  
        kSecClass as String: kSecClassGenericPassword,  
        kSecAttrAccount as String: user,  
        kSecValueData as String: password.data(using: .utf8)!  
      ]  
      SecItemAdd(query as CFDictionary, nil)  
    }  
    

五、分布式数据同步

1. HarmonyOS - 分布式数据服务(DDS)

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    data.createKVManager()创建分布式数据管理器let kvManager = data.createKVManager({ bundleName: 'com.example' });
    kvManager.getKVStore()获取分布式数据库实例let kvStore = await kvManager.getKVStore('store1', { autoSync: true });
    kvStore.put()写入数据(自动同步到其他设备)await kvStore.put('key', 'value');
    kvStore.on('dataChange')监听数据变更事件kvStore.on('dataChange', (data) => { ... });
    kvStore.get()读取本地数据(可能未同步最新值)let value = await kvStore.get('key');
  • 场景示例

    // 跨设备同步用户设置  
    async function syncSettings() {  
      let kvManager = data.createKVManager({ bundleName: 'com.example.app' });  
      let kvStore = await kvManager.getKVStore('settings', { autoSync: true });  
      await kvStore.put('theme', 'dark'); // 自动同步到其他设备  
    }  
    

2. iOS - CloudKit

  • 核心 API 及调用顺序

    API 方法用途说明代码示例
    CKContainer.default()获取 CloudKit 容器let container = CKContainer.default()
    container.privateCloudDatabase获取私有数据库(用户专属)let database = container.privateCloudDatabase
    CKRecord(recordType:)创建记录对象let record = CKRecord(recordType: "User")
    database.save(_:completionHandler:)保存记录到 CloudKitdatabase.save(record) { (savedRecord, error) in ... }
    CKQuery构建查询条件let query = CKQuery(recordType: "User", predicate: NSPredicate(value: true))
  • 场景示例

    // 同步用户数据到 iCloud  
    func syncUserToCloud(user: User) {  
      let record = CKRecord(recordType: "User")  
      record["name"] = user.name  
      CKContainer.default().privateCloudDatabase.save(record) { _, error in  
        if error == nil { print("同步成功") }  
      }  
    }  
    

总结

通过对比 API 调用顺序和实际代码示例,可以清晰看到:

  1. HarmonyOS 更强调 异步操作(如 await)和 声明式 API(如 RdbPredicates)。
  2. iOS 的 API 更依赖 闭包回调(如 CloudKit)和 链式语法(如 Core Data 的 NSFetchRequest)。
  3. 加密与同步:HarmonyOS 通过 TEE 和分布式软总线实现本地安全与跨设备同步,iOS 依赖 Secure Enclave 和 iCloud 云端服务。