CoreDataQueryでCRUDを実装する [RubyMotion]
はじめに
前回、"CoreDataQueryでデータを保存する“では、CoreDataQueryを用いてデータを保存してみました。
今回はコンソールからではなく、アプリ上で一覧、保存、更新、削除が出来るように実装してみます。
準備
アプリの基本は前回のものを使います。
今回はフォーム画面もあるため、画面構築を簡易にするためにformotionと、ProMotionとformotionを組み合わせるProMotion-formotionを追加しました。
ProMotion-formotionを使う場合、現在はProMotion, formotionともにgitにあるコードを指定する必要があります。
Gemfile
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
schema "0001 initial" do
entity "Item" do
string :body
end
end
app/models/item.rb
class Item < CDQManagedObject
end
app_delegate.rb
は前回と変わりありません。
app/app_delegate.rb
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
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
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"ボタンで新規作成画面に、そして各項目のタップで編集が出来るようになっています 。