Swift Realm 完整使用记录

摘要:
新项目用到了数据库,本来之前用的都是SQL,但是语法写的实在是恶心,所以使用Realm尝试一下。pod'RealmSwift'end2、在AppDelegate的didFinishLaunchingWithOptions中添加如下方法,引入头文件importRealmSwift/*Realm数据库配置,用于数据库的迭代更新*/letschemaVersion:UInt64=0//数据库工具类的版本号SSRealmTool.schemaVersion=schemaVersionletconfig=Realm.Configuration(schemaVersion:schemaVersion,migrationBlock:{(migration,oldSchemaVersion)in/*什么都不要做!

新项目用到了数据库,本来之前用的都是 SQL,但是语法写的实在是恶心,所以使用 Realm 尝试一下。

1、我使用的 pod 库,所以先 pod 库安装一下,安装完别忘了先编译一下,不然 import 不到头文件

platform :ios, '8.0'

target 'realmExmple' do
  use_frameworks!

pod 'RealmSwift'

end

2、在 AppDelegate 的 didFinishLaunchingWithOptions 中添加如下方法,引入头文件 import RealmSwift

        /*Realm 数据库配置,用于数据库的迭代更新 */let schemaVersion: UInt64 = 0
        //数据库工具类的版本号
        SSRealmTool.schemaVersion =schemaVersion
        
        let config = Realm.Configuration(schemaVersion: schemaVersion, migrationBlock: { (migration, oldSchemaVersion) in
            /*什么都不要做!Realm 会自行检测新增和需要移除的属性,然后自动更新硬盘上的数据库架构 */
            if (oldSchemaVersion <schemaVersion) {
                print("----数据库升级")
            }
        })
        
        Realm.Configuration.defaultConfiguration =config
        
        Realm.asyncOpen { (realm, error) in
            /*Realm 成功打开,迁移已在后台线程中完成 */
            if let _ =realm {

                print("Realm 数据库配置成功")
            } else if let error = error { /*处理打开 Realm 时所发生的错误 */
                print("Realm 数据库配置失败:(error.localizedDescription)")
            }
        }

3、接下来开始写数据库工具类,新建一个 Swift 文件 SSRealmTool

classSSRealmTool {
    
    ///数据库版本号
    static var schemaVersion: UInt64 = 0
    
    ///唯一的数据库操作的 Realm
    static let ss_realm =realm()
    
    ///获取数据库操作的 Realm
    private static func realm() ->Realm {
        
        //获取数据库文件路径
        let fileURL = URL(string: NSHomeDirectory() + "/Documents/demo.realm")
        //在 APPdelegate 中需要配置版本号时,这里也需要配置版本号
        let config =Realm.Configuration(fileURL: fileURL, schemaVersion: schemaVersion)
        
        return try!Realm(configuration: config)
    }
    
}

4、新建两个对象 SSDog SSPerson

classSSDog: Object {
    //主键不自增,如果要主键的话,这样写不会有重复的主键
//@objc dynamic var id = NSUUID().UUIDString
    //@objc dynamic **必须写
    @objc dynamic var name = ""@objc dynamic var age = 0@objc dynamic var date =Date()
    //如果需要增加属性的话,只需要在 appdelegate 的版本号加 1 即可自动升级
//@objc dynamic var weight = 1
    
    ///所属人可选
    @objc dynamic var person: SSPerson?
    
    //设置主键的方法
//override static func primaryKey() -> String? {
//return "id"
//}
}
classSSPerson: Object {

    @objc dynamic var name = ""@objc dynamic var age = 0
    
    //数组使用 List
    let dogs = List<SSDog>()
}

5、可以在 viewController 中调用我们的数据库了

5.1、添加一个 person

        let realm =SSRealmTool.ss_realm
        
        let person =SSPerson()
        person.name = "person(arc4random_uniform(1000))"person.age = Int(arc4random_uniform(20))
        
        for _ in 0..<9{
            
            let dog =SSDog()
            dog.name = "dog(arc4random_uniform(1000))"dog.age = Int(arc4random_uniform(10))
            dog.person =person
            person.dogs.append(dog)
            print("添加一只狗:(dog.name),age:(dog.age),date:(dog.date)")
        }
        
        try!realm.write {
            realm.add(person)
            print("添加一个人:(person.name),年龄:(person.age)")
        }

5.2、查询

        let realm =SSRealmTool.ss_realm
        print("总共有(realm.objects(SSPerson.self).count)位人")
        print("总共有(realm.objects(SSDog.self).count)只狗")
        
        if realm.objects(SSDog.self).count == 0 || realm.objects(SSPerson.self).count == 0{
            return}
        let dogs = realm.objects(SSDog.self).filter("age <= 5")
        
        for dog indogs {
            print("---查询狗:(dog.name), age:(dog.age),主人是:(dog.person?.name ?? "无人")")
        }
        
        print("---------person---------")
        
        let persons = realm.objects(SSPerson.self).filter("age <= 10")
        
        for person inpersons {
            print("---查询name:(person.name), 有(person.dogs.count)只狗")
            print("-----每个人下面的狗-------")
            let someDogs = person.dogs.filter("age <= 5")
            for someDog insomeDogs {
                print("---查询狗:(someDog.name), age:(someDog.age),主人是:(someDog.person?.name ?? "无人")")
            }
        }

5.3、更新

        let realm =SSRealmTool.ss_realm
        
        let dogs = realm.objects(SSDog.self).filter("age > 5")
        
        for dog indogs {
            
            try!realm.write {
                
                print("---更新前name:(dog.name), age:(dog.age)")
                dog.name += "修改"
//realm.add(dog, update: true) //这需要主键
}
        }
        
        let dogs2 = realm.objects(SSDog.self).filter("age > 5")
        
        for dog indogs2 {
            print("---更新后name:(dog.name), age:(dog.age)")
        }

5.4、删除

        let realm =SSRealmTool.ss_realm
        
        let person =SSPerson()
        person.name = "person(arc4random_uniform(1000))"person.age = Int(arc4random_uniform(20))
        
        for _ in 0..<9{
            
            let dog =SSDog()
            dog.name = "dog(arc4random_uniform(1000))"dog.age = Int(arc4random_uniform(10))
            dog.person =person
            person.dogs.append(dog)
            print("添加一只狗:(dog.name),age:(dog.age),date:(dog.date)")
        }
        
        try!realm.write {
            realm.add(person)
            print("添加一个人:(person.name),年龄:(person.age)")
        }

免责声明:文章转载自《Swift Realm 完整使用记录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Maven Android使用一现在主流的开源java连接池下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Shiro【自定义Realm实战】

一、前言 虽然 Shiro 给我们提供了很多内置的 Realm,但在企业开发中,这往往不适用于项目中。 所以,都需要自定义 Realm 来使用。 二、步骤 创建一个类 ,继承 AuthorizingRealm ​ (继承关系:自定义Realm->AuthorizingRealm->AuthenticatingRealm->Cachi...

Keycloak快速上手指南,只需10分钟即可接入Spring Boot/Vue前后端分离应用实现SSO单点登录

登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种场景而生。本文将简明的介绍Keycloak的安装、使用,并给出目前较流行的前后端分离应用如何快速接入Keycloak的示例。 Keycloak是什么 Keyc...

Shiro认证流程

认证流程图解: 身份认证流程 1、首先调用Subject.login(token) 进行登录,其会自动委托给SecurityManager 2、SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator 进行身份验证; 3、Authenticator 才是真正的身份验证者,ShiroAPI 中核心的身份认证入口点,此处可...

shiro的单机版 和 集群版

在我们的开发当中 我们一般权限都是个 比较繁琐 但又必不可少的 一部分 【不管我们的 数据库设计 还是我们采用何种技术 我们的权限库表 大多都是大同小异 业务逻辑也是如此】 在我们不使用任何框架的时候 我们也是可以做到 但是细节过于麻烦 在很多时候 都是重复造轮子的过程 所以出现了 很多开源比较休息的额权限框架如:shiro Spring security...

当shiro不进入自定义realm的权限认证方法时

需要加入下面的一个bean @Bean public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){ DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();...

Android之Realm详解(非原创)

文章大纲 一、Realm介绍二、Realm实战三、Realm官方文档四、项目源码下载五、参考文章 一、Realm介绍 1. 什么是Realm   Realm 是一个手机数据库,是用来替代 SQlite 的解决方案,比 SQlite 更轻量级,速度更快,因为它有一套自己的数据库搜索引擎,并且还具有很多现代数据库的优点,支持 JSON,流式 API 调用,数...