【iOS】SQLiteの更新がシミュレータに反映されなさすぎて半日過ぎた件について


Objc

相変わらずiPhone向けの寿司アプリの開発に勤しむ毎日です。 (毎日はやってないけど)

今回、DBを使う必要があったのですがどうしてもRDBを使用したくてSQLiteを使うことに。 CoreDataは周りの人の話を聞くと「あれはアカンやつ」と言われたので手を出しませんでした。

で、SQLiteなんですが普通にProjectに突っ込んだ後はSELECTしたり普通に使えてたのでよしよしと思って開発を続けていたんですが、テーブルのスキーマとかを色々いじっても全然RUNしたときに反映されない。 とにかく反映されない。 とか言ってたら半日経ちました。

今回やりたかったこと

今回、寿司アプリなのでSQLiteに「まぐろ」とか「いか」とかのデータを入れたtableを作り、それをFMDBで好きなようにselectしてくる っていうのをやろうとしていました。

ちなみにですが、一番元のマスターデータをExcellで管理しているのですがこれをSQLiteにバッチで突っ込むのが超絶しんどかったです。(というか更新するのがしんどい。。 これはまた別の機会にエントリします)

さて、マスターDBをこさえたらXcodeにぶちこみます。 今回は無駄にdatabaseFileというディレクトリをきってその配下に設置しました。(あとであまり意味なかったって気づきました)


BeautifulSushi SeasonPage h

で、このsqliteの中身を無事RUNさせた時にアプリ側で参照できてめでたし だったのですが、その後テーブルのスキーマを変更したり、新しいレコードを追加したりしました。 macではsqliteクライアントとしてLitaがいいぜ っていう記事がたくさんあったのでLitaで編集していました。


Icon 128 2

その変更が全然反映されない件
まいりました。 Litaでsqliteをupdateする → Xcodeで実行 → iOSシミュレータで反映されてない → なんで?!

一応cleanしてからビルドし直したりもしましたが、何も変わらない様子。 んー とおもってdebugログを色々と仕込んだ所、完璧にsqliteの中身が古いままの様子。

なんでだーーー!!

と、叫びながら壮絶にハマりました。 ハマりすぎて、気がついたらMCハマーのPVをyoutubeで見漁っていました。ハマーだけに。

ハマ男とは?

1988年、MCハマーは1stアルバムを世界的に大ヒットさせその独特なストリートダンスで一世を風靡しました。
その波は日本にも到来し、国内においてもMCハマーの服装や髪型を真似した男性のストリートスタイルが社会現象になります。 そんな彼らはハマ男と呼ばれていました。


E3838FE3839EE383BC

私はどちらかというととんねるずの石橋がマネしてるのを見てる記憶しかないですが、未だにたまに流行りますよね。

なぜiOSシミュレータに更新が反映されないのか?

結論からいうと、sqliteのファイルはiOSシミュレータ側で上書きしてくれないようです。
つまり、XcodeのProject側でいくら更新してもiOSシミュレータは初回ビルド時に渡されたsqliteファイルを保持し続けていて、その後はビルド実行時にいくら変更されていても無視するらしい。

なぜか?

言われてみれば確かにー なのですが、ユーザがアプリを使っていくにつれてsqliteにユーザデータなどをinsertしたりするので、基本的にあれはユーザのもの(っぽい。。 通説的に)。
なので初回ビルド時以降、sqliteを更新しちゃうと(アプリの作りによっては)ユーザが自分のデータ入れてても消えちゃうので、基本的に U can’t touch this っぽいです。

U can’t touch this !!


MC Hammer U Cant Touch This 1

ほんとすいません。 もうこれが言いたかっただけで、このブログをpostしたようなもんです。 昨日の夜、風呂でシャワー浴びている最中に思いつきました。 20代前半の人とかは一体何のことなのだ? と思われるかもしれませんが、気にしない。

解決方法

簡単に言うと、iOSシミュレータの保持しているsqliteを抹殺する。 けどちょっと探すの大変だった。

どこにそいつはいるのか? というと、自分の環境(OS X mavericks, Xcode5) だと以下。
/Users/(user name)/Library/Application Support/
に、7.1とか 7.1-64 とかiOSシミュレータで実行した事のあるiOSバージョンのディレクトリがある。その下に Applicationsがあって、その中に記号みたいなディレクトリがあってその中にいる。 で、この記号みたいなヤツがたくさんあってどれやねん っていうとXcodeでアプリ起動時にどのディレクトリか教えてくれている。
↓ここみればわかりますね。


BeautifulSushi RootViewController m

あとはその直下のDocuments ディレクトリを覗けばお目当てのsqliteがいるので削除してやる。
すると次からビルドした際にProject側の最新のsqliteがコピーされる。 ※一応cleanはした方がいいかも。

(∩´∀`)∩ワーイ

ちなみに、実機でテストしている場合は実機側でテストアプリを削除してまるごと消せばOK。

アプデの時ってどうするの?

ふと思った。 アプリを公開した後に、オッサンが新しくマスターDBにレコードを追加した際ユーザ側にどうやって更新させたらいい?
ユーザに一回アプリを削除してもらう? いやいや、まさか。

とか思って調べたら超絶ありがたいブログを発見
iPhoneアプリ開発・Objective-C勉強まとめ

やっぱりDB名を更新していくのが一番手っ取り早そうですねー。

余談

早くアプリをリリースしちゃいたい件
おわり

2014-08-04 | Posted in Objective-C2 Comments » 


関連記事

コメント2件

 げる | 2016.05.09 0:18

同じ疑問を持ちこちらのページへ到着しました。
ハマーにツボってしまいコメントさせていただきました。素敵です。
“U cant’t touch this !!”
“can’t”が誤って表記されていますが「触れてくれるな!」とも受け取れましたので、スルーで。

 altarfの管理人 | 2016.05.09 9:52

ありがとうございます!
このエントリ書いたのは2年まえなのですが、お役にたてたようで何よりです!
誤記に関してのご指摘もありがとうございました。
修正させていただきました。

Comment





Comment



*