Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【iOS】基于Realm数据库的记账软件--Realm数据库(一)

【iOS】基于Realm数据库的记账软件--Realm数据库(一)

作者头像
MapleYe
发布于 2020-03-31 03:03:46
发布于 2020-03-31 03:03:46
1.5K00
代码可运行
举报
文章被收录于专栏:MapleYeMapleYe
运行总次数:0
代码可运行

1、数据库表设计

账单表:Bill

字段

类型

说明

billID

NSString

账单ID,主键

date

NSString

账单产生日期

money

Double

账单金额

isIncome

Bool

true代表收入,false代表支出

remark

NSString

备注

accountID

NSString

账户ID外键

categoryID

NSString

类别ID外键

bookID

NSString

账本ID外键

</br> 账单类型表:Category

字段

类型

说明

cateID

NSString

账单类型ID,主键

name

NSString

类型名

imageName

NSString

图标名

isIncome

Bool

true代表收入,false代表支出

</br> 账户表:Account

字段

类型

说明

accountID

NSString

账户ID,主键

name

NSString

类型名

money

Double

账户余额

</br> 账本表:Book

字段

类型

说明

bookID

NSString

账本ID,主键

name

NSString

账本名

</br> 以上,就是该项目的所有数据库表。实际项目会因业务需求,追加一些字段,但核心还是不变的。

2、Realm数据库

2.1、概述

Realm 是一个跨平台的移动数据库引擎,2014年7月发布,准确来说,它是专门为移动应用所设计的数据持久化解决方案之一。Realm可以轻松地移植到您的项目当中,并且绝大部分常用的功能(比如说插入、查询等等)都可以用一行简单的代码轻松完成!

2.2、特点

Realm有如下特点:

  • 跨平台:现在绝大多数的应用开发并不仅仅只在iOS平台上进行开发,还要兼顾到 Android平台的开发。为两个平台设计不同的数据库是愚蠢的,而使用 Realm 数据库, iOS和Android 无需考虑内部数据的架构,调用Realm提供的API 就可以完成数据的交换,实现“一个数据库,两个平台无缝衔接 ”。
  • 简单易用:Core Data 和 SQLite 冗余、繁杂的知识和代码足以吓退绝大多数刚入门的开发者,而换用Realm,则可以极大地减少学习代价和学习时间,让应用及早用上数据存储功能。
  • 可视化:Realm 还提供了一个轻量级的数据库查看工具,借助这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。毕竟,很多时候,开发者使用数据库的理由是因为要提供一些所谓的“知识库”

2.3、基本使用

2.3.1、创建

官方api: https://realm.io/cn/docs/objc/latest/

</br> 在Realm数据库中,你不需要写任何的sql语句,只需将你的模型继承RLMObject,之后的事情就不需要再管了。 </br> 例如,账单表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// 账单模型
@interface MPBillModel : RLMObject

/// 账单ID
@property (nonatomic, copy) NSString *billID;
/// 账单产生日期,要跟recordDate区分开
@property (nonatomic, copy) NSString *dateStr;
/// 账单记录日期,指的是生成账单的时间,用于排序
@property (nonatomic, strong) NSDate *recordDate;
/// 是否为收入
@property (nonatomic, assign) BOOL isIncome;
/// 备注
@property (nonatomic, copy) NSString *remark;
/// 金额
@property (nonatomic, assign) double money;
/// 账单类别
@property (nonatomic, strong) MPCategoryModel *category;
/// 账户
@property (nonatomic, strong) MPAccountModel *account;
/// 账本
@property (nonatomic, strong) MPBookModel *book;
@end

RLM_ARRAY_TYPE(MPBillModel)

在.m文件中指定主键

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "MPBillModel.h"

@implementation MPBillModel

+ (NSString *)primaryKey
{
  return @"billID";
}

@end

</br>

2.3.2 增删查改

在Realm中,你不需要写一句sql语句,即可完成增删查改。除了查询之外,“删增改”等写入操作必须开启事务,否则程序就会崩溃!

查询

Realm查询支持以下三种方式: 1、使用断言字符串查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// 获得指定账本的所有账单
MPBookModel *book = [[MPBookManager shareManager] getCurrentBook];
  RLMResults *results = [MPBillModel objectsWhere:@"book=%@", book];

2、使用 NSPredicate 查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// 在指定账本,查询某个月份开头的账单
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dateStr BEGINSWITH %@ and book.bookID=%@", dateStr, book.bookID];
    RLMResults *results = [MPBillModel objectsWithPredicate:predicate];

3、链式查询 例如对插叙后的结果集进行排序,可以分以下两布

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// 获取当前账本的所有账单后,再排序
- (RLMResults *)getBillsInCurrentBook
{
  MPBookModel *book = [[MPBookManager shareManager] getCurrentBook];
  RLMResults *results = [MPBillModel objectsWhere:@"book=%@", book];
  // 返回排序后的结果集
  return [self sortTheResultsByDate:results];
}

/// 排序
- (RLMResults *)sortTheResultsByDate:(RLMResults *)results
{
  // 首先根据dateStr(账单时间)进行排序
  RLMSortDescriptor *desc1 = [RLMSortDescriptor sortDescriptorWithKeyPath:@"dateStr" ascending:NO];
  // 再根据recordDate(记录时间)进行排序
  RLMSortDescriptor *desc2 = [RLMSortDescriptor sortDescriptorWithKeyPath:@"recordDate" ascending:NO];
  return [results sortedResultsUsingDescriptors:@[desc1, desc2]];
}

对Realm数据库进行写入操作时,必须开启事务。开启事务有以下两种方式:

1、分别调用开启和关闭事务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[realm beginWriteTransaction];
[realm commitWriteTransaction];

2、使用block

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
    // 进行操作
  }];

添加有两种方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//1 、调用realm的addObject
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
    // me是RLMObject
    [realm addObject:me];
 }];

//2、调用模型的createInDefaultRealmWithValue方法
  [kRealm transactionWithBlock:^{
    [MPBillModel createInDefaultRealmWithValue:bill];
    }];
}

直接调用realm的deletObject方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
    [realm deleteObject:bill];
  }];
修改

修改内容只要开启事务后,直接拿对象做操作即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// 将账单的金额改为999
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
    bill.money = 999
  }];

2.3.3、主键的创建

由于Realm是不支持ID自增的,如果要实现ID自增,需要自己实现,并且性能会不好。因此,在这里,我们需要给每一个字段创建一个独一无二的ID。 那么,我们可以通过NSUUID产生主键,方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// MyUtils.m
/**
 创建主键

 @return 主键
 */
+ (NSString *)createKey
{
  NSUUID *uid = [NSUUID UUID];
  return uid.UUIDString;
}

2.3.4、注意

当你的数据模型发生变化时,需要调用以下代码进行数据库迁移。建议在AppDelegate中的 didFinishLaunchingWithOptions调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// 数据库版本检测
- (void)dbVersionCheck
{
  RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
  // 设置新的架构版本。这个版本号必须高于之前所用的版本号(如果您之前从未设置过架构版本,那么这个版本号设置为 0)
  config.schemaVersion = 1;
  
  // 设置闭包,这个闭包将会在打开低于上面所设置版本号的 Realm 数据库的时候被自动调用
  config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
    // 目前我们还未进行数据迁移,因此 oldSchemaVersion == 0
    if (oldSchemaVersion < 1) {
      // 什么都不要做!Realm 会自行检测新增和需要移除的属性,然后自动更新硬盘上的数据库架构
    }
  };
  
  // 告诉 Realm 为默认的 Realm 数据库使用这个新的配置对象
  [RLMRealmConfiguration setDefaultConfiguration:config];
  
  // 现在我们已经告诉了 Realm 如何处理架构的变化,打开文件之后将会自动执行迁移
  [RLMRealm defaultRealm];
}

3、Realm Browser

Realm提供了一个专门用于查看Realm数据库的可视化工具---Realm Browse。在App Store即可进行下载~只需要打印出沙盒路径后,找到doucument下的realm文件即可查看。若查看失败,请留意一下Realm库的版本与Realm Browser的版本(一般最新的Realm库,需要新版的Realm Browser才能查看)。

这里写图片描述

4、小结

在本文中,对项目所要使用的数据表列出来了,以及简单介绍了Realm的使用。建议大家在使用前建个小demo体验一下~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【iOS】基于Realm数据库的记账软件--时间线模块(三)
接下来,我们将开始搭建时间线界面。该模块是界面展示中最大的难点--时间线布局。那么,我们先来看看效果图,因为gif上传后,动不了。所以在这里用几张截图和文字简单的描述一下,具体效果大家可下载项目自行查看~
MapleYe
2020/03/31
9490
【iOS】基于Realm数据库的记账软件--时间线模块(三)
Realm数据库 从入门到“放弃”
Realm是由Y Combinator公司孵化出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。目前最新版是Realm 2.0.2,支持的平台包括Java,Objective-C,Swift,React Native,Xamarin。
一缕殇流化隐半边冰霜
2018/08/30
5.3K0
【iOS】基于Realm数据库的记账软件--记账模块(二)
从记账的需求出发,该界面需要用户输入以下账单信息: (1)账单金额 (2)账单类型 (3)相关账户 (4)账单产生的日期 (5)备注 那么,结合一下需求,开始构思一下界面如何搭建吧。
MapleYe
2020/03/31
1.1K0
【iOS】基于Realm数据库的记账软件--记账模块(二)
手把手教你从 Core Data 迁移到 Realm - 简书
看了这篇文章的标题,也许有些人还不知道Realm是什么,那么我先简单介绍一下这个新生的数据库。号称是用来替代SQLite 和 Core Data的。Realm有以下优点:
一缕殇流化隐半边冰霜
2024/02/14
3350
手把手教你从 Core Data 迁移到 Realm - 简书
iOS开发实战-时光记账Demo 本地数据库版效果分析Demo地址
由于主页只是一个展示的时光轴界面,UIScrollView加几个按钮就能完成,需要读取数据库内容,所以我们先把内页-增加账单 完成。
gwk_iOS
2018/08/23
2.5K0
iOS开发实战-时光记账Demo 本地数据库版效果分析Demo地址
【iOS】基于Realm数据库的记账软件--钱包/记账模块(四)终
接下来,我们将开始钱包模块和记账模块。其实钱包模块是整个项目中最简单的一部分了,所以我将挑几个点说一说~还是老规矩,先看看界面效果: 图一:
MapleYe
2020/03/30
8620
【iOS】基于Realm数据库的记账软件--钱包/记账模块(四)终
iOS开发·第三方数据库处理框架:Realm 基本用法
除了FMDB,Realm也是一种很流行的数据库方案。 1. 官方资料 (最新版)Realm Objective‑C官方文档地址 https://realm.io/docs/objc/latest/ (中文版)Realm Objective‑C官方文档地址(内容相对英文版不一定是最新的)https://realm.io/cn/docs/objc/latest/ Realm官方API查阅手册 https://realm.io/docs/objc/latest/api/ GitHub源码地址 http
陈满iOS
2018/09/10
1.2K0
Realm、WCDB与SQLite移动数据库性能对比测试
Realm 是由Y Combinator孵化的创业团队开源出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。目前最新版是Realm 2.0.2,支持的平台包括Java,Objective-C,Swift,React Native,Xamarin。
Cloudox
2021/11/23
4.4K0
Realm、WCDB与SQLite移动数据库性能对比测试
Java数据库项目之满汉楼
src/com/hspedu/mhl/dao/DiningTableDAO.java
timerring
2023/05/24
6800
Java数据库项目之满汉楼
【iOS】基于Realm数据库的记账软件--前言
笔者在今年毕业的时候,为了应付学校的毕业设计,因此做了一款基于Realm数据库的记账软件。现在毕业后,稍微闲下来了,所以打算将整个项目的核心实现步骤记录下来,供大家学习学习。当然,项目中肯定还存在着大大小小的bug,例如数据的溢出等细节处理。那么先让大家看看项目的效果图吧~
MapleYe
2020/03/31
8520
【iOS】基于Realm数据库的记账软件--前言
[iOS学习笔记]·FMDB:第三方数据库处理框架·用法示例篇(附源码Demo)
FMDatabase的实例对象_db在执行SQL语句的时候采取类似下面的代码。其中,有两种风格,一种在executeUpdate方法后面直接写上字符串的字面量语法。另一种在执行方法的后面基于SQL字符串初始化一个NSString对象。
陈满iOS
2018/09/10
1.1K0
[iOS学习笔记]·FMDB:第三方数据库处理框架·用法示例篇(附源码Demo)
微信公号DIY:MongoDB 简易ORM & 公号记账数据库设计
介绍了如何使用搭建&训练聊天机器人以及让公号支持图片上传到七牛,把公号变成一个七牛图片上传客户端。这一篇将继续开发公号,让公号变成一个更加实用的工具账本(理财从记账开始)。
goodspeed
2020/12/22
1.5K0
微信公号DIY:MongoDB 简易ORM & 公号记账数据库设计
iOS开发实战-时光记账Demo 网络版效果分析客户端部分服务端部分Demo地址简书主页
user表 相反Tally与Users的关系就是:一对多
gwk_iOS
2018/08/23
2.7K0
iOS开发实战-时光记账Demo 网络版效果分析客户端部分服务端部分Demo地址简书主页
【Android】Realm详解
介绍 Realm 是一个 MVCC (多版本并发控制)数据库,由Y Combinator公司在2014年7月发布一款支持运行在手机、平板和可穿戴设备上的嵌入式数据库,目标是取代SQLite。 Realm 本质上是一个嵌入式数据库,他并不是基于SQLite所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。和SQLite不同,它允许你在持久层直接和数据对象工作。在它之上是一个函数式风格的查询api,众多的努力让它比传统的SQLite 操作更快 。 详细介绍(如果进不去,看这个也行)
Gavin-ZYX
2018/05/18
4.6K0
iOS开发之EventKit框架的应用
      iOS系统自带的Calendar应用非常强大,用户可以在其中添加日程事件,并且其提供了接口供其他应用进行调用,可以向日历中进行事件的读取和写入。
珲少
2019/07/01
4.2K0
iOS开发之EventKit框架的应用
iOS中CoreData数据管理系列三——添加与查询数据
    在前两篇博客中,分别介绍了iOS中CoreData框架创建数据模型和CoreData框架中的三个核心类。博客地址如下:
珲少
2018/08/15
9570
iOS中CoreData数据管理系列三——添加与查询数据
iOS本地数据存储
数据存储本质就是运行时的对象保存在文件、数据库中。数据存储可以分为两步:首先是将对象转换成二进制数据,这一步也叫序列化;相反,将二进制数据转换成对象则称为反序列化;然后是考虑二进制数据如何保存和读取。
落影
2019/07/15
3.2K0
iOS本地数据存储
iOS开发实战之搜索控制器UISearchController使用
当tableView中的数据过多的时候,在tableView上加一个搜索框就变的很必要了,本文就讨论搜索控制器的使用,以及谓词的简单实现。
用户1219438
2018/12/26
2.9K0
iOS开发之蓝牙通讯 原
        蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单。相关的蓝牙操作由专门的CoreBluetooth.framework进行统一管理。通过蓝牙进行通讯交互分为两方,一方为中心设备central,一方为外设peripheral,外设通过广播的方式向外发送信息,中心设备检索到外设发的广播信息,可以进行配对连接,进而进行数据交互。
珲少
2018/08/15
1.2K0
iOS开发——FMDB的使用
今天决定给手上的项目加上一个数据库,用来进行数据持久化操作,关于在iOS端的数据持久化方式的差异,这里也就不再赘述,相信如果真实使用并且去感受过的人,有自己的评判标准。
Originalee
2018/08/30
8150
推荐阅读
相关推荐
【iOS】基于Realm数据库的记账软件--时间线模块(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档