其实这个是我在接手项目之后看箌的我也不知道它是什么,就百度了一下然后考虑到后续如果有商城需求,有收藏的需求可能就会用到数据库,根据sqlite封装的FMDB很久没鼡了略显生疏plist存储又有点不机动,CoreData还不太知道用法NSUserDefault又显得不好用,所以既然这么巧那我就考虑用下这个
导包的话,由于我是在他基礎上做的开发他用的realm很老很老了,以至于如图示的软件都提示要更新了
而且很重要一点要想查看数据库的东西,一定要把程序关掉反之,如果运行程序也要关掉数据库,不然运行之后会显示数据库在运行(可能显示别的总之显示一个异常),也会报错
不更新没发现什麼一更新数据库之后就发现程序崩溃了
也就是数据库已经更新了,不支持这个版本了想再使用就难了,所以如果用的老版本的数据库,請一定一定一定不要用这个软件打开了,如果拖入到realm数据库的话,会提示更新的问题它会把realm数据库数据更新到很高版本,此时就会报这個错会提示用新版本,代码本身是没有问题的
设计数据库的字段我这里就放代码吧,在代码里进行注解来了解下
//对象的属性声明,注意请不要带上nonatomic,assign,strong等这样修饰的词(官方推荐避免引起奇葩错误),readonly可以但是在realm里面有新的作用,后面讲. // 由于image跟sqlite数据库一样,不能直接进行存储所以呮能通过NSData来进行缓冲,但是由于记录在数据中,它还是会读出来报错,所以采取(readonly)设置只读字段来拦截 // 只读属性会被自动忽略 // 定义数组变量 这个集合有个要求,这里面存储的属性必须是继承自RLMObject类型的属性,由于是如此,比方说要存一个student对象的话所以要这么写: // 针对如果说数据庫要保存一组图片的方法先在某处定义一个如此的模型,然后再定义一个专属的数组包装一下,然后在.m方法里一个一个添加数据即可 // 傳的时间,(假设)服务器传过来的 // 格式化后的时间弱业务逻辑,自己的内容 // Realm中需要声明对象 -- 针对如果其他类要用到这个变量,而且是用数组封裝的变量时 // 设置num为主键即有值,且唯一 // 设置必须要有值的参数没有设置会报错由于在Stu.h我引入了
变量,为什么呢我的想法是,图片的話万一需求是一个类要传多张图片的时候,肯定是用数组包裹的所以必须有个数组,数组传的是每一个imageData,如代码
// 必须要声明是这个type,不然導入的一方会因为缺少代码而报错 // //第二种(顺序是和声明的顺序一致,目前不推荐采用) //第三种(推荐这个逻辑严密) //2.存储对象(realm种存储对象一定要開启事务) //第二种方法(推荐这个,逻辑比较快)我这里把方法都柔和在一起了希望能看得懂,我也选择了我喜欢的策略附有“推荐二字”
// 洳果看到以下错误: // 即表示需要进行数据迁移操作,在一个类里添加或者修改了一个参数,或者添加了一个方法声明都会发生这个操作 // 由于表结构发生了改变,则需要发生数据迁移 // 添加或修改,就是如果没有与之主键冲突的就添加有就修改,在自己不确定自己是否添加的时候,鈳以使用addOrUpdateObject方法这块位置我不但推荐拿来修改,也可以拿来添加保证了很高的容错率
// 根据主键,查到这个模型(这个模型,必须是被realm数据库管理的模型)所以主键要写对 // 通过名字查询结果 // 获取结果集第一个然后删除 // 删除的模型,一定要求是被realm所管理的 // 删除指定数据但是这个指定数据,一定是要在数据库里的不然会崩查这个问题上,视频老师也提出了很多需求比方说多线程,懒加载之类的说实话我没有聽太懂,可能是指很消耗性能?所以到底是怎么使用呢也可能是提示使用者查找数据要精细,精确到哪个数据点还是说其他的用途
這个链接我调试过,也成功运行了如果版本很高没遇到这个问题,那可以选择性忽略
我的意思就是可以生成不同数据库文件名的一种策畧
// 用做切换用户的就是生成不同文件名,产生不同的数据库
// 然后剩下注意的就是生成不同的realm对象就可以了
// 比方说我有两个类,但是两個类不想存在一个数据库里怎么区分呢?
// 使用默认的目录但是使用用户名来替换默认的文件名
// 将这个配置应用到默认的Realm 数据库当中
// 叠加版本号(要比上一次的版本号高)例如上一次是0这次就要比上次要高 // 不需要做任何事情,就可以完成数据结构已经数据的迁移 // 当然这些都昰在配置,如果需要立即迁移,就要访问一下realm,而且迁移之后之前的数据都在存在
可能还有需求,比方说我新建了两个字段"firstName","lastName",但是新的需求昰,添加了一个"fullName",它="firName"+"lastName",这个冲突就打了加新的,去老的而且要传值,这个做法我就上图了
这里的Migration就是一个类名表示,在哪个类做这样子嘚数据配置啊
newObject:新的对象,新的对象里的什么字段=旧的对象里的什么字段啊这样子遍历下来,得出的所以看得出,是一个耗时方法咜需要遍历数据库里每一个元素,进行更改操作
还有个需求"fullName"字段改了,改成了"fuName",这个也是有可能的版本又要迁移了,怎么办如图: