CoreDataQueryでCRUDを実装する [RubyMotion]

# はじめに

前回、"[CoreDataQueryでデータを保存する](http://k-shogo.github.io/article/2014/04/09/rubymotion-core-data-query/)"では、CoreDataQueryを用いてデータを保存してみました。
今回はコンソールからではなく、アプリ上で一覧、保存、更新、削除が出来るように実装してみます。

### 準備

アプリの基本は[前回](http://k-shogo.github.io/article/2014/04/09/rubymotion-core-data-query/)のものを使います。
今回はフォーム画面もあるため、画面構築を簡易にするために[formotion](https://github.com/clayallsopp/formotion)と、[ProMotion](https://github.com/clearsightstudio/ProMotion)とformotionを組み合わせる[ProMotion-formotion](https://github.com/rheoli/ProMotion-formotion)を追加しました。
ProMotion-formotionを使う場合、現在はProMotion, formotionともにgitにあるコードを指定する必要があります。

## `Gemfile`

```ruby
source 'https://rubygems.org'

gem 'ProMotion', git: 'https://github.com/clearsightstudio/ProMotion.git'
gem 'formotion', git: 'https://github.com/clayallsopp/formotion.git'
gem 'ProMotion-formotion'
gem 'cdq'
```

`bundle install`および`cdq init`を済ませ、

```
bundle install --path vendor/bundle
bundle exec cdq init
```

スキーマ定義とモデル作成も行います。

## `schemas/0001_initial.rb`

```ruby
schema "0001 initial" do

  entity "Item" do
    string :body
  end

end
```

## `app/models/item.rb`

```ruby
class Item < CDQManagedObject

end
```

`app_delegate.rb`は前回と変わりありません。

## `app/app_delegate.rb`

```ruby
class AppDelegate < PM::Delegate
  include CDQ
  def on_load(app, options)
    cdq.setup
    open ItemsScreen.new(nav_bar: true)
  end
end
```

# 画面作成

メインの画面を作っていきましょう。

## `app/screens/items_screen.rb`

```ruby
class ItemsScreen < PM::TableScreen
  title "Items"

  def load_item
    PM::logger.debug "load_item"
    @items = [
      {
        cells: Item.map do |item|
          {
            title:         item.body,
            action:        :tapped_item,
            arguments:     item,
            editing_style: :delete
          }
        end
      }
    ]
    update_table_data
  end

  def on_load
    set_nav_bar_button :right, title: "Add", action: :open_item_form_screen
  end

  def open_item_form_screen
    open ItemFormScreen.new(nav_bar: true), modal: true
  end

  def on_appear
    load_item
  end

  def table_data
    @items ||= []
  end

  def tapped_item(item)
    open ItemFormScreen.new(item: item, nav_bar: true)
  end

  def on_cell_deleted(cell)
    cell[:arguments].destroy
    cdq.save
  end
end
```

## `app/screens/item_form_screen.rb`

```ruby
class ItemFormScreen < PM::FormotionScreen
  title "Item"

  attr_accessor :item

  def on_load
    nav_bar_title = item.nil? ? 'Save': 'Update'
    set_nav_bar_button :right, title: nav_bar_title, action: :save_item
    set_nav_bar_button :left,  title: 'Cancel',      action: :cancel
  end

  def save_item
    if item.nil?
      Item.create(form.render)
    else
      item.body = form.render[:body]
    end
    cdq.save
    close
  end

  def cancel
    close
  end

  def table_data
    value = item.nil? ? "" : item.body
    {
      sections: [
        {
          title: "Item",
          rows: [
            {
              title:       "Body",
              key:         :body,
              type:        :string,
              placeholder: "text here",
              value:       value
            }
          ]
        }
      ]
    }

  end

end
```

これで、一覧、作成、更新、削除がアプリ内で出来るようになりました。  
一覧画面でスワイプすると削除リンクが出現し、”Add"ボタンで新規作成画面に、
そして各項目のタップで編集が出来るようになっています 。

![screen](http://k-shogo.github.io/images/2014-04-10-rubymotion-cdq-crud/screen.png)