Hatena::Groupiphone-dev

haoyayoi Dev Style このページをアンテナに追加 RSSフィード

2010-01-11

CoreDataの構成

| 14:25 | CoreDataの構成 - haoyayoi Dev Style を含むブックマーク はてなブックマーク - CoreDataの構成 - haoyayoi Dev Style CoreDataの構成 - haoyayoi Dev Style のブックマークコメント

サンプルのCoreDataBooksを弄くり通して移植とか試みた結果、どこがどうなってるのかようやく把握できた感じなのでメモ。

そもそも何故分かりづらいのか

CoreDataはSQliteObjective-Cのみで操作できることにメリットがあるわけですが、その操作を行うためのクラス名、取り扱い方に問題があります。

イメージしずらいネーミング

各クラスの解説を読むと判明しますが、実際には他の言語で使われているDBとの接続を行うための各種クラスと、CoreData関連クラスがやってることには、あまり違いはありません。ただ、それらのクラスと余りに剥離したネーミングというのが一つ。

複数のDBの接続を同時に取り扱っている

もう一つは、あくまでCoreDataは「複数のDBとそれらDBとの接続情報」をひとまとめにした代物であるため、他の言語でのDBと同じ感覚で取り扱うとズレが生じるということ。

TableView専用というわけではないNSFetchedResultsController

さらにもう一つ、NSFetchedResultsController自体はCoreDataから取得したデータの配列キャッシュしているコントローラであり、別にUITableViewController専用のオブジェクトではない、ということ。

CoreDataのコンテキスト構成

コンテキスト以下の構成図を貼ってみます。

f:id:hao_yayoi:20100111130810p:image

  • NSManagedObjectModel
    • 他の言語での、DBのColumnとRelationShip指定に相当。
  • NSPersisitentStore
    • DBとの接続を担当。

ColumnもといEntityを追加したい場合にはNSManagedObjectModelへの操作、接続するDBを増やしたい場合にはNSPersistentStoreを追加するといった形です。

NSPersistantStore追加の際の実DBファイル

接続するDBを増やす場合にはNSPersistentStoreを追加するわけですが、実体のファイルもその際に自動で生成されています。

データ追加

f:id:hao_yayoi:20100111135826p:image

NSEntityDescriptionで追加先のEntityを指定すると生成されるオブジェクトレコード相当)に値を入れて保存、という流れです。DBへのレコード追加をSQLを直接触れずに行う形です。

データの読み込み

f:id:hao_yayoi:20100111141156p:image

NSFetchedResultsControllerを生成した時点で、データの取得ができ上がるため、あとは取得したデータの配列からインデックスを指定して取得という流れ。

まとめ

NSManagedObjectContextを構成する際の煩雑さも原因だと思うので、NSManagedObjectContextまでの生成過程を一つのクラスにして分離したほうが、なにかと分かりやすいかと思います。

あと、これらを一つ一つ確かめていくとどこかで同じ構成をみたような感覚があったのですが、PerlにおけるDBIx::Classがそれでした。どんな感じなのかは、

を読むと分かりやすいと思います。

2009-10-10

Catalyst用Apple Push Notification Serviceモジュール

| 02:07 | Catalyst用Apple Push Notification Serviceモジュール - haoyayoi Dev Style を含むブックマーク はてなブックマーク - Catalyst用Apple Push Notification Serviceモジュール - haoyayoi Dev Style Catalyst用Apple Push Notification Serviceモジュール - haoyayoi Dev Style のブックマークコメント

perlMVCフレームワークCatalystモジュールとして、Catalyst::View::APNSを書いてみました。githubに上げてます。作成完了したらCPANに申請の予定。

Catalyst::View::APNS

掲示板とかでメールによる通知とかもありますが、Pushで通知とかもあってもよさそうなものです。Catalystに触れる事が多くなったので、せめてCatalystだけでもそれをお手軽にしたいと思いました。CPAN申請が完了したら改めて書く事にします。

2009-10-03

ビルド時にClangを自動で実行させる

| 22:45 | ビルド時にClangを自動で実行させる - haoyayoi Dev Style を含むブックマーク はてなブックマーク - ビルド時にClangを自動で実行させる - haoyayoi Dev Style ビルド時にClangを自動で実行させる - haoyayoi Dev Style のブックマークコメント

現行の最新Xcodeは、ソースコードの静的解析を行うClangがメニューから実行できるようになっています。逐一設定実行する手間が省けて助かる事間違い無しなんですが、毎回clangのために余計な操作をするのは本当面倒です。

余り知られていませんが、このClangも自動で実行できるようになっています。デフォルトで実行がONになっていれば良いとは思うんですが、多分それだと初学者の壁が只管高くなるとかそんな具合だと思います。

設定方法

  1. Xcodeのメニューから、「プロジェクト->プロジェクト設定を編集」の順に選択します。
  2. ビルドオプションの「静的アナライザを実行」にチェックをいれます。

f:id:hao_yayoi:20091003224520p:image

2009-09-22

CoreDataを使う場合のトラブルシュート

| 09:16 | CoreDataを使う場合のトラブルシュート - haoyayoi Dev Style を含むブックマーク はてなブックマーク - CoreDataを使う場合のトラブルシュート - haoyayoi Dev Style CoreDataを使う場合のトラブルシュート - haoyayoi Dev Style のブックマークコメント

Macでのデータベース取り扱いが楽になるというCoreDataですが、確かにMacアプリでは開発が楽になるようです。というのも、iPhoneでは色々とコーディングが要求されてしまうから。結果、はまってしまうところがでて、それが解消されにくい場合は、思い切ってFMDBで行うほうが幸せかもしれません。

試行錯誤しつつ組み込みに挑戦していますが、エラーが完全には解消されず詰まっている状態です。現状に至るまでに分かったいくつかのはまりポイントについてまとめてみます。

+entityForName: could not locate an NSManagedObjectModel for entity...

xcdatamodel内でEntityの名称が間違っている場合や、NSEntityDescriptionを生成する以前にNSPersistentStoreCoordinatorなどを適切に生成していない、など。

Z_PKなどの、頭にZが付くコラムが足りないと表示される

sqliteファイルを手動作成した場合、CoreDataに用いるsqliteのテーブルおよびコラム名は、イニシャルがZで始まる必要があります。(NameならZNameになる、など)

また、CoreDataが用いる専用のテーブルを作成する必要もあります。

参考:Core Data Error: Can’t Find Model for Source Store

CREATE TABLE Z_PRIMARYKEY (Z_ENT INT Primary Key, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER);

CREATE TABLE Z_METADATA (Z_VERSION INT Primary Key, Z_UUID VARCHAR(255), Z_PLIST BLOB);

Entityを収めたテーブルにも、システムが管理に用いるためのコラムの追加が必要です。

Z_OPT INTEGER

Z_PK INTEGER PRIMARY KEY

2009-08-29

Snow Leopardインストールで操作が必要になるもの幾つか

| 21:34 | Snow Leopardインストールで操作が必要になるもの幾つか - haoyayoi Dev Style を含むブックマーク はてなブックマーク - Snow Leopardインストールで操作が必要になるもの幾つか - haoyayoi Dev Style Snow Leopardインストールで操作が必要になるもの幾つか - haoyayoi Dev Style のブックマークコメント

Snow Leopardをインストールして、かなり動作がきびきびしているものと思われます。が、それの代償というべきか、色々と環境調整も必要になりました。以下ログのようなものです。

XCodeのインストール

Snow Leopardのインストールディスクにアップグレード版が含まれています。ディスク不良か読み込み不良なのか、いずれの場合でもインストールに失敗した場合はXCode 3 - Snow Leopard - Apple Developers Connection(要ログイン)からダウンロードしましょう。

iPhone SDK for Snow Leopardのインストール

同じくiPhone Developer Connectionよりダウンロードします。

MacPortsのインストール

前準備なしにSnow Leopardにアップグレードしてしまうと、portコマンドを実行しただけでエラーとなります。アップグレード前に一度全て削除推奨です。

(参照:Snow Leopardにアップデートした後に気をつけること)

sudo port -f uninstall installed

うっかり削除する前にインストールしてしまったら、まずSnow Leopard対応インストーラにてインストール。その後、上記の全削除を実行。そして、必要なものを入れていきます。

なお、対応インストーラ導入後に

sudo port upgrade installed

にてまとめてアップデートという手段もありますが、ライブラリによってはアップグレードに失敗してそこから先に進まなくなるものもあるので注意が必要です。