使用Realm和Swift编写一个Todo应用

作者:HOSSAM GHAREEB,时间:2015/11/28
翻译:BigNerdCoding, 如有错误欢迎指出。原文链接

在去年智能手机的大更新之后,很多工具也同时被开发出来了。这些工具让我们开发者发布一个高性能、高质量的应用的变的更加简单了。在应用商店获得高排名以及不再很容易。而且让应用更容易拓展也是很困难的一件事。当你的应用成功的拥有百万级别的用户的时候,你需要注意应用中的所有事情以及所有操作。因此,现在每个开发者都需要面临的一个问题就是处理数据库。而这又是一件让人感到非常头疼的事情,大多数的开发者会在sqliteCore Data中挑选一个。曾经我是Core Data的拥趸,因为它在处理数据以及持久化数据方面功能非常强大。但是后来我发现使用Core Data会浪费很多时间。现在我会使用Realm,该框架能够很好的替换sqliteCore Data

Realm是什么

Realm是一个跨平台的手机端数据库支持iOS(Swift和Object双语言版本)、安卓。相比于sqliteCore Data更好也更快。除此之外,它的使用也很方便之需要几行代码就可以搞定。Realm是一个开源产品你可以免费试用。Realm之所以会出现是因为在过去的十年中移动数据库没有任何可喜的更新。过去在处理移动数据库的时候,你几乎只能选择sqlite或者在其基础上进行封装的Core Data。因为Realm并不是一个ORM(对象关系映射)且有自己的持久化引擎使得Realm容易使用并且拥有很好的性能和速度。

为什么选择Realm

Realm快的难以置信并且易用,你能看见任何你需要的东西,并且只需要几行代码就可以完成数据库的读写操作。这里我会列出所有在移动端使用Realm的好处和理由:

  • 安装简单:在后面你会发现安装Realm比你想象的还要简单,之需要在Cocoapods中添加简单的命令就能使用了。

  • 速度:Realm远快过于sqliteCore Data,官方提供的比较证据

  • 跨平台:Realm的数据库文件是跨平台的,它可以在iOS和Android中进行分享。无论你是使用Java、Object-C、还是Swift,你都可以使用高级的模型。

  • 可拓展性:当你的手机应用拥有大量的用户以及数据记录的时候可拓展就是很重要的一个特征。拓展性问题从一开始设计和选择工具的时候就需要进行认真的考虑。Realm在能够高效处理大数据量的同时依然拥有着非常好的拓展性。在应用中引入该框架会让程序的速度得到提升。

  • 良好的文档支持:Realm团队提供了可读性强、组织良好的的丰富文档给大家。如果你依旧有问题解决不了的话,可以在 Twitter、Github、Stackoverflow上去向它们寻求帮助和解答。

  • 可靠:Realm依旧被大量的创业团队和公司的移动应用使用像:Pinterest、dubsmash、Hipmunk。

  • 免费:如此强大,而且还是完全免费的。

开始干活

让我们Realm使用教程,并用它创建一个Swift语言版本的iPhone简单Todo应用。用户在该应用中可以添加多个任务链表,每个链表里面又会有多个任务。每个任务都有一个标题、备注、到期时间,一个图像附件以及一个标记是否完成的标记量。在开始编写工程之前我们首先需要配置Xcode并安装Realm工作所需的一个工具。

需要的条件

下列条件必须满足:

  • iOS 8 or later、OS X 10.9 or later。

  • Xcode 6.3 or later。

  • Realm的有两个Swift版本,一个是2.0版本另一个是1.2版本。我们在教程中使用的是2.0版本。你也可以选择使用1.2版本的,但是该版本在未来不会被维护和支持,因此最安全的办法就是使用2.0版本。

配置Xcode并安装工具

再开始配置Xcode之前请确保你已经安装了CocoaPods,我们需要使用它在Xcode工程中安装Realm。如果你对CocoaPods不熟悉的话,你可以去官网操作安装教程。

现在,我们创建一个"Single View Application"模版的工程,并将工程命名为“RealmTasks”或者你喜欢的名称。请确保使用的是Swift语言。接下来我们在终端中切换到当前工程的目录并按照下面步骤初始化工程的CocoaPods。

pod init

使用编辑器生成的文件podfile,并在文件中添加如下内容:

接下来运行命令"pod install"去下载安装Realm到你的工程里面。当安装完成后,你会发现文件夹下面又一个新的Xcode workspace被创建了。打开RealmTasks.xcworkspace文件,你会看见如下界面:

现在Realm已经能够使用了,但是我们还是安装一些工具类帮助我们更加容易的使用Realm。

安装Realm插件

Realm团队为Xcode提供了很好的插件,该插件能够创建Realm模型。我们使用Alcatraz来安装这个插件。该工具可以很好的帮助你自动安装那些开源的插件,模版、颜色主题。对于那些不知道Alcatrza的开发者来说,这可以节省很多的时间和精力。直接使用下面的命令安装Alcatrza:

curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh

接下来在Xcode中选择Window菜单栏下面的Package Manager,如下图:

在弹出的窗口中选择你需要安装的类型,并在搜索框中输入对应的插件、模版或者主题。我们选择Plugins,输入"Realm",在出现的结果里面选择"RealmPlugin"并安装。如下图:

此处可能在Xcode7.1以上版本会出现一些问题,解决方法

Realm browser

最后一个工具是Realm browser。该浏览器可以帮助你查看或者编辑你的.realm数据库文件。这些数据文件在你的应用中被创建出来,并且包含了里面的实体、属性、以及数据表中的纪录。这些文件如之前所说的一样可以在像iOS、Android这样不同的平台之间分享。你可以在iTunes store下载到最新版本的工具。打开该应用选择Tools -> Genetate demo database,应用会为你新建一个测试数据库文件你可以在浏览器中看到所有的纪录。如下图:

正如上图显示的,类RealmTestClass1有1000条纪录以及不同类型的参数(列)。我们会在下面接受它支持的类型。

现在一切准备工作都已经完成了。开始编码吧。

数据库Model类

游戏开始了!首先我们需要新建一个模型类。可以通过创建一个继承与Object的Swift类。考虑到Object是所有Realm model类的基类,你可以拓展任何拓展自Obeject的Realm model类。当你创建自己的类的时候,理所当然你需要定义属性。Realm支持下面各种类型的属性:

  • Int,Int8,Int16,Int32,and Int64

  • Boolean

  • Float

  • String

  • NSDate

  • NSData

  • Class extends Object => Used for One-to-one relations

  • List<Object> => Used for one-to-many relations

List在Realm类中表示对象实例的集合,就像上面演示数据库截图表示的那样。截图中的最后一列就是一个存在于另一张表中纪录指针的数组。在使用Realm模型类的时候,你可以像对待其他Swift类一样对待它。例如,你可以在类里面添加函数方法,协议。

Talk is cheap,show me the code

使用Realm和Swift编写一个ToDo应用的更多相关文章

  1. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  2. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  3. ios – Realm:无法使用类型'(Object.Type)’的参数列表调用’对象’

    所以我在Realm中有一个非常简单的Book模型而我正在尝试在帮助程序类中检索所有书籍:这一行:抛出标题中的错误.我疯了还是这不是Realm文档告诉我们要做的?解决方法realm.objects()不会返回[Book]但会返回结果?.所以你必须改变userBookLibrary的类型:

  4. ios – 无法识别的选择器发送到实例NSTimer Swift

    解决方法让updateTime成为一个类方法.如果它是在一个纯粹的Swift类中,你需要在@objc前面说明该方法的声明,如:

  5. ios – 多个NSPersistentStoreCoordinator实例可以连接到同一个底层SQLite持久性存储吗?

    我读过的关于在多个线程上使用CoreData的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedobjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用CoreData来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.问题是NSPersistentStoreCoordinator会对基础

  6. cocoapods – 命令/ bin / sh失败,退出代码23

    适用于所有豆荚,无需豆荚但仍然是同样的错误.有任何想法吗?

  7. ios – Swift 2.0中的动态可选属性

    我已经看过这篇文章OptionaldynamicpropertiesinSwift,但我不想在NSObject中包装该类.这只是关于Realm数据库我没有nil属性,但我认为这是一个很好的方式来建模我的数据库.在可以在https://realm.io/docs/swift/latest/中找到的Realm文档中,它表示支持选项.这是我的码这是我的错误我知道这是与上面的帖子相同的代码和错误,但我很好

  8. ios – 在后台线程中写入Realm后,主线程看不到更新的数据

    >清除数据库.>进行API调用以获取新数据.>将从API检索到的数据写入后台线程中的数据库中.>从主线程上的数据库中读取数据并渲染UI.在步骤4中,数据应该是最新数据,但我们没有看到任何数据.解决方法具有runloops的线程上的Realm实例,例如主线程,updatetothelatestversionofthedataintheRealmfile,因为通知被发布到其线程的runloop.在后台

  9. ios – CoreData有序关系 – 使用NSFetchRequest批量取消

    或者,是否存在批量不支持的API,它不是私有的?解决方法目前我有一个解决方案,但不是一个干净的解决方案:我希望按照有序关系中的20个小组进行批量修改.所以,每次我索引一个索引,它的索引除以20,我为接下来的20使用新的NSFetchRequest,并通过调用公共字段名称来解除它们.

  10. ios – 使用SQLite和CoreData进行批量插入

    我有一个使用sqlite作为持久性存储的CoreData模型.在对每条记录进行一些处理之后,我需要插入大量的行.有没有办法将这些命令发送到sqlite我需要加快处理时间,因为它需要几个小时才能完成.任何提示将不胜感激.谢谢解决方法将商店添加到商店协调员时,可以指定编译指示:(改编自PersistentStoreFeatures)我强烈建议您阅读“有效导入数据”.相关文档:NSSQLitePragm

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部