Swift CoreData


在Android中,一想到要操作SQLite,就觉得很繁琐;但是IOS中,有一套非常成熟的数据库API(接口)和GUI(图形用户界面),这样大大提升了用户体验,虽然,我们开发者,但是不可否认的是,我们也是一种另类的用户,一看到GUI,很多人可能更偏爱于IOS开发。

IOS数据库数据的增、删、改、查,其实也就是对NSManagedObjectContext的增、删、改、查。

项目适配CodeData

其实真的很简单,只需要你勾上User Core Data这个选项即可。

13-1

然后你会看到项目中的AppDelegate.swift文件多了不少东西。其中也包括如下:

<code class="language-Swift hljs coffeescript has-numbering">    lazy <span class="hljs-reserved">var</span> <span class="hljs-attribute">persistentStoreCoordinator</span>: NSPersistentStoreCoordinator = {
        <span class="hljs-regexp">//</span> The persistent store coordinator <span class="hljs-keyword">for</span> the application. This implementation creates <span class="hljs-keyword">and</span> returns a coordinator, having added the store <span class="hljs-keyword">for</span> the application to it. This property <span class="hljs-keyword">is</span> optional since there are legitimate error conditions that could cause the creation <span class="hljs-keyword">of</span> the store to fail.
        <span class="hljs-regexp">//</span> Create the coordinator <span class="hljs-keyword">and</span> store
        <span class="hljs-reserved">let</span> coordinator = NSPersistentStoreCoordinator(<span class="hljs-attribute">managedObjectModel</span>: self.managedObjectModel)
        <span class="hljs-reserved">let</span> url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(<span class="hljs-string">"SingleViewCoreData.sqlite"</span>)

        <span class="hljs-regexp">//</span> 打印数据库文件存放目录
        NSLog(<span class="hljs-string">"\(url)"</span>)

        <span class="hljs-reserved">var</span> failureReason = <span class="hljs-string">"There was an error creating or loading the application's saved data."</span>
        <span class="hljs-keyword">do</span> {
            <span class="hljs-keyword">try</span> coordinator.addPersistentStoreWithType(NSSQLiteStoreType, <span class="hljs-attribute">configuration</span>: nil, <span class="hljs-attribute">URL</span>: url, <span class="hljs-attribute">options</span>: nil)
        } <span class="hljs-keyword">catch</span> {
            <span class="hljs-regexp">//</span> Report any error we got.
            <span class="hljs-reserved">var</span> dict = [<span class="hljs-attribute">String</span>: AnyObject]()
            dict[NSLocalizedDescriptionKey] = <span class="hljs-string">"Failed to initialize the application's saved data"</span>
            dict[NSLocalizedFailureReasonErrorKey] = failureReason

            dict[NSUnderlyingErrorKey] = error as NSError
            <span class="hljs-reserved">let</span> wrappedError = NSError(<span class="hljs-attribute">domain</span>: <span class="hljs-string">"YOUR_ERROR_DOMAIN"</span>, <span class="hljs-attribute">code</span>: <span class="hljs-number">9999</span>, <span class="hljs-attribute">userInfo</span>: dict)
            <span class="hljs-regexp">//</span> Replace <span class="hljs-keyword">this</span> <span class="hljs-reserved">with</span> code to handle the error appropriately.
            <span class="hljs-regexp">//</span> abort() causes the application to generate a crash log <span class="hljs-keyword">and</span> terminate. You should <span class="hljs-keyword">not</span> use <span class="hljs-keyword">this</span> <span class="hljs-reserved">function</span> <span class="hljs-keyword">in</span> a shipping application, although it may be useful during development.
            NSLog(<span class="hljs-string">"Unresolved error \(wrappedError), \(wrappedError.userInfo)"</span>)
            abort()
        }

        <span class="hljs-keyword">return</span> coordinator
    }()

    lazy <span class="hljs-reserved">var</span> <span class="hljs-attribute">managedObjectContext</span>: NSManagedObjectContext = {
        <span class="hljs-regexp">//</span> Returns the managed object context <span class="hljs-keyword">for</span> the application (which <span class="hljs-keyword">is</span> already bound to the persistent store coordinator <span class="hljs-keyword">for</span> the application.) This property <span class="hljs-keyword">is</span> optional since there are legitimate error conditions that could cause the creation <span class="hljs-keyword">of</span> the context to fail.
        <span class="hljs-reserved">let</span> coordinator = self.persistentStoreCoordinator
        <span class="hljs-reserved">var</span> managedObjectContext = NSManagedObjectContext(<span class="hljs-attribute">concurrencyType</span>: .MainQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator
        <span class="hljs-keyword">return</span> managedObjectContext
    }()

    <span class="hljs-regexp">//</span> <span class="hljs-attribute">MARK</span>: - Core Data Saving support

    func saveContext () {
        <span class="hljs-keyword">if</span> managedObjectContext.hasChanges {
            <span class="hljs-keyword">do</span> {
                <span class="hljs-keyword">try</span> managedObjectContext.save()
            } <span class="hljs-keyword">catch</span> {
                <span class="hljs-regexp">//</span> Replace <span class="hljs-keyword">this</span> implementation <span class="hljs-reserved">with</span> code to handle the error appropriately.
                <span class="hljs-regexp">//</span> abort() causes the application to generate a crash log <span class="hljs-keyword">and</span> terminate. You should <span class="hljs-keyword">not</span> use <span class="hljs-keyword">this</span> <span class="hljs-reserved">function</span> <span class="hljs-keyword">in</span> a shipping application, although it may be useful during development.
                <span class="hljs-reserved">let</span> nserror = error as NSError
                NSLog(<span class="hljs-string">"Unresolved error \(nserror), \(nserror.userInfo)"</span>)
                abort()
            }
        }
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li></ul>

我就是在看到let url的时候,打印了url的路径。


CoreData建数据库

同样也是一个按钮!

13-2

点击Add Entity后,然后点击建好的Entity选中后,按空格就可以修改数据库的名字了。


CoreData添加数据库属性

13-3

这里可以添加或者删除属性,也能修改属性的类型。


CoreData 增

数据库的任何操作都要涉及到(增、删、改、查)NSManagedObjectContext对象。

通过这段代码能拿到本App的NSManagedObjectContext
(UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

获取添加新数据的NSManagedObject
NSEntityDescription.insertNewObjectForEntityForName(entityName: String, inManagedObjectContext context: NSManagedObjectContext) -> NSManagedObject

保存NSManagedObjectContext对象,不保存的话,什么都是扯淡
NSManagedObjectContext.save() throws

<code class="language-Swift hljs cs has-numbering">    <span class="hljs-comment">// 添加数据</span>
    func insert(){
        <span class="hljs-comment">// 获取NSManagedObjectContext对象</span>
        <span class="hljs-keyword">let</span> context:NSManagedObjectContext = (UIApplication.sharedApplication().<span class="hljs-keyword">delegate</span> <span class="hljs-keyword">as</span>! AppDelegate).managedObjectContext

        <span class="hljs-comment">// 获取用于添加新Users表数据的NSManagedObject对象</span>
        <span class="hljs-keyword">let</span> user:NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName(<span class="hljs-string">"Users"</span>, inManagedObjectContext: context)

        <span class="hljs-comment">// 添加name属性的值</span>
        user.setValue(<span class="hljs-string">"CaMnter"</span>, forKey: <span class="hljs-string">"name"</span>)
        <span class="hljs-comment">// 添加sign属性的值</span>
        user.setValue(<span class="hljs-string">"Save you from anything"</span>, forKey: <span class="hljs-string">"sign"</span>)
        <span class="hljs-comment">// 添加age属性的值</span>
        user.setValue(<span class="hljs-number">22</span>, forKey: <span class="hljs-string">"age"</span>)
        <span class="hljs-keyword">do</span>{
            <span class="hljs-comment">// NSManagedObjectContext对象保存</span>
            <span class="hljs-keyword">try</span> context.save()
        }<span class="hljs-keyword">catch</span> <span class="hljs-keyword">let</span> error <span class="hljs-keyword">as</span> NSError{
            print(error.localizedDescription)
        }
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li></ul>

CoreData 删

删除NSManagedObject
NSManagedObjectContext.deleteObject(object: NSManagedObject)

<code class="language-Swift hljs php has-numbering">    <span class="hljs-comment">// 删除数据</span>
    func deleteNSManagedObject(indexPath: NSIndexPath){
        <span class="hljs-comment">// 通过NSManagedObject对象找到数据库的这条数据,并删除</span>
        <span class="hljs-keyword">self</span>.context.deleteObject(<span class="hljs-keyword">self</span>.dataArr[indexPath.row] <span class="hljs-keyword">as</span>! NSManagedObject)
        <span class="hljs-keyword">do</span>{
            <span class="hljs-comment">// NSManagedObjectContext保存</span>
            <span class="hljs-keyword">try</span> <span class="hljs-keyword">self</span>.context.save()
        }<span class="hljs-keyword">catch</span> let error <span class="hljs-keyword">as</span> NSError{
            <span class="hljs-keyword">print</span>(error.localizedDescription)
        }
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

CoreData 改

其实也就是拿到对应要修改的NSManagedObject,然后重新对字段赋值。

<code class="language-Swift hljs php has-numbering">    <span class="hljs-comment">// 更新NSManagedObject对象</span>
    func updateNSManagedObject(obejct:NSManagedObject){
        <span class="hljs-comment">// 重新设置这个NSManagedObject上字段的值</span>
        obejct.setValue(<span class="hljs-keyword">self</span>.nameTV.text, forKey: <span class="hljs-string">"name"</span>)
        obejct.setValue(<span class="hljs-keyword">self</span>.signTV.text, forKey: <span class="hljs-string">"sign"</span>)
        <span class="hljs-keyword">do</span>{
            <span class="hljs-comment">// 获取NSManagedObject对应的NSManagedObjectContext,并保存</span>
            <span class="hljs-keyword">try</span> <span class="hljs-keyword">self</span>.obejct.managedObjectContext?.save()
        }<span class="hljs-keyword">catch</span> let error <span class="hljs-keyword">as</span> NSError{
            NSLog(error.localizedDescription)
        }
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

CoreData 查

CoreData查询数据的话,涉及到另外一个API**NSFetchRequest**。

NSFetchRequest的便利构造方法
NSFetchRequest:
public convenience init(entityName: String)

通过NSFetchRequest查询对应表里的数据
NSManagedObjectContext.executeFetchRequest(request: NSFetchRequest) throws -> [AnyObject]

查询

<code class="language-Swift hljs php has-numbering">    <span class="hljs-keyword">var</span> dataArr:<span class="hljs-keyword">Array</span><AnyObject> = []

    <span class="hljs-keyword">var</span> context:NSManagedObjectContext!
    <span class="hljs-keyword">var</span> fetch:NSFetchRequest!

    override func viewDidLoad() {
        super.viewDidLoad()

        <span class="hljs-comment">// Uncomment the following line to preserve selection between presentations</span>
        <span class="hljs-comment">// self.clearsSelectionOnViewWillAppear = false</span>

        <span class="hljs-comment">// Uncomment the following line to display an Edit button in the navigation bar for this view controller.</span>
        <span class="hljs-comment">// self.navigationItem.rightBarButtonItem = self.editButtonItem()</span>

        <span class="hljs-comment">// 实例化NSManagedObjectContext对象</span>
        <span class="hljs-keyword">self</span>.context = (UIApplication.sharedApplication().delegate <span class="hljs-keyword">as</span>! AppDelegate).managedObjectContext
        <span class="hljs-comment">// 实例化NSFetchRequest对象</span>
        <span class="hljs-keyword">self</span>.fetch = NSFetchRequest(entityName: <span class="hljs-string">"Users"</span>)
        <span class="hljs-comment">// 开始查询</span>
        <span class="hljs-keyword">self</span>.query()
    }


    <span class="hljs-comment">// 查询数据</span>
    func query(){
        <span class="hljs-keyword">do</span>{
           <span class="hljs-keyword">self</span>.dataArr = <span class="hljs-keyword">try</span> <span class="hljs-keyword">self</span>.context.executeFetchRequest(<span class="hljs-keyword">self</span>.fetch)
        }<span class="hljs-keyword">catch</span> let error <span class="hljs-keyword">as</span> NSError{
            <span class="hljs-keyword">print</span>(error.localizedDescription)
        }
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li></ul>

提取数据

<code class="language-Swift hljs cs has-numbering">    <span class="hljs-keyword">override</span> func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        <span class="hljs-keyword">let</span> cell = tableView.dequeueReusableCellWithIdentifier(<span class="hljs-string">"cell"</span>, forIndexPath: indexPath)

        <span class="hljs-comment">// Configure the cell...</span>
        <span class="hljs-keyword">let</span> label = cell.viewWithTag(<span class="hljs-number">6</span>) <span class="hljs-keyword">as</span>! UILabel

        <span class="hljs-comment">// 提取对应数据</span>
        <span class="hljs-keyword">let</span> <span class="hljs-keyword">object</span>:NSManagedObject = self.dataArr[indexPath.row] <span class="hljs-keyword">as</span>! NSManagedObject
        <span class="hljs-comment">// 根据字段提取数据</span>
        <span class="hljs-keyword">let</span> name = <span class="hljs-keyword">object</span>.valueForKey(<span class="hljs-string">"name"</span>) <span class="hljs-keyword">as</span>! String
        <span class="hljs-keyword">let</span> sign = <span class="hljs-keyword">object</span>.valueForKey(<span class="hljs-string">"sign"</span>) <span class="hljs-keyword">as</span>! String

        label.text = <span class="hljs-string">"\(name):\(sign)"</span>
        <span class="hljs-keyword">return</span> cell
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值