Github每日精选(第35期):移动设备数据库Realm

发布于:2022-12-29 ⋅ 阅读:(243) ⋅ 点赞:(0)

Realm

Realm 是一个直接在手机、平板电脑或可穿戴设备中运行的移动数据库。这个存储库包含 iOSmacOStvOSwatchOS 版本的 Realm Swift Realm Objective-C 的源代码。

github 下的地址在这里
在这里插入图片描述

使用领域

  • 对开发人员直观: Realm 的面向对象数据模型易于学习,不需要 ORM,并且可以让您编写更少的代码。
  • 专为离线使用而设计: Realm 的本地数据库将数据保存在磁盘上,因此应用程序离线工作与在线工作一样好。
  • 专为移动设备打造: Realm 功能齐全、重量轻,可有效利用内存、磁盘空间和电池寿命。

面向对象:简化您的代码

Realm 是为移动开发人员构建的,并考虑到了简单性。惯用的、面向对象的数据模型可以为您节省数千行代码。

// Define your models like regular Swift classes
class Dog: Object {
    @Persisted var name: String
    @Persisted var age: Int
}
class Person: Object {
    @Persisted(primaryKey: true) var _id: String
    @Persisted var name: String
    @Persisted var age: Int
    // Create relationships by pointing an Object field to another Class
    @Persisted var dogs: List<Dog>
}
// Use them like regular Swift objects
let dog = Dog()
dog.name = "Rex"
dog.age = 1
print("name of dog: \(dog.name)")

// Get the default Realm
let realm = try! Realm()
// Persist your data easily with a write transaction 
try! realm.write {
    realm.add(dog)
}

Live Objects

Realm 的活动对象意味着在任何地方更新的数据都会在任何地方自动更新。

// Open the default realm.
let realm = try! Realm()

var token: NotificationToken?

let dog = Dog()
dog.name = "Max"

// Create a dog in the realm.
try! realm.write {
    realm.add(dog)
}

//  Set up the listener & observe object notifications.
token = dog.observe { change in
    switch change {
    case .change(let properties):
        for property in properties {
            print("Property '\(property.name)' changed to '\(property.newValue!)'");
        }
    case .error(let error):
        print("An error occurred: (error)")
    case .deleted:
        print("The object was deleted.")
    }
}

// Update the dog's name to see the effect.
try! realm.write {
    dog.name = "Wolfie"
}

SwiftUI

Realm 直接与 SwiftUI 集成,无需更新视图即可。

struct ContactsView: View {
    @ObservedResults(Person.self) var persons
    
    var body: some View {
        List {
            ForEach(persons) { person in
                Text(person.name)
            }
            .onMove(perform: $persons.move)
            .onDelete(perform: $persons.remove)
        }.navigationBarItems(trailing:
            Button("Add") {
                $persons.append(Person())
            }
        )
    }
}

完全加密

数据可以在动态和静态加密,即使是最敏感的数据也能保持安全。

// Generate a random encryption key
var key = Data(count: 64)
_ = key.withUnsafeMutableBytes { bytes in
    SecRandomCopyBytes(kSecRandomDefault, 64, bytes)
}

// Add the encryption key to the config and open the realm
let config = Realm.Configuration(encryptionKey: key)
let realm = try Realm(configuration: config)

// Use the Realm as normal
let dogs = realm.objects(Dog.self).filter("name contains 'Fido'")

数据同步

设备同步服务让用户、设备和后端之间的数据实时同步变得简单。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到