告知!
折角なので、ブログにまとめることにしました。
まこネタ -Tech- で読めます。よろしくね!
目次
- 2015/06/01 はじめに
- 2015/06/03 下準備とか
- 2015/06/05 「画面とか面倒だぞ!?」
- 2015/06/06 Swift/GUIの初歩の初歩
- 2015/06/07 ボタンを押したら、RealmのREST機能で、jsonをゲットしよう!
- 2015/06/08 そもそも冷静に考える。本当にRealmなのか!?
- 2015/06/10 SwiftDataにハマりまくり
はじめに
Macbook Pro 13 Retina 2015が届いて2週間。環境構築も進み、「そろそろはじめますか」という気持ちになった。
はい! 実践編スタートです。
下準備とか
とりあえず、作りたいアプリとして、LinuxのMySQLに登録されたデータを、何らかの方法で吸い上げて、iOSのローカルDBに登録し、そのローカルDBでうにゃうにゃやって、情報を表示するものです。
そのため、MySQLと交信する必要があるが、いろいろ調べると、流行はREST(Representational State Transfer)というものを使うようだ。ならば!と、数時間格闘し、FuelPHPでREST機能を設計・実装して、とりあえず1つのデータを抜き出せるようにした。まあ、そもそものMySQLに格納されるデータ作りに手間取ったんだが...
iOSのローカルDBは、Realmを利用するつもりなので、CococaPods を使えるようにする。Mac OS Xなら簡単。Realmは、RESTサーバと通信する機能もあるので、簡単に実装できると思っていた...
「画面とか面倒だぞ!?」
Swiftの言語仕様も理解していないし、iOSアプリの作り方も理解していない。これは困ったな~と思っていたら、Swiftには「Playground」というお試し環境があるようだ。
Realmのソースにあるサンプルをじっくり読み、「Playground」で試そうとして、エラーが(T.T)/ そもそも「import」が見えないとのこと。ググってみると、Swift PlaygroundでCocoaPodsのライブラリを使うを見つける。なるほどーこういう事をしないといけないのね。
やってみよう...
...
....
.....エラーだ(T.T)/ どうも、サンプルがだめっぽい。よし、出直しだ!w
Swift/GUIの初歩の初歩
Xcode6/Swiftで、ボタンを押すとラベルが変わるだけのアプリを作る を参考に、ボタンを押したらラベルが変わるアプリを作る。えーこの程度もわからないのか、悲しい。まあ、超初心者だからな。
ザクッと。GUIパーツと、ソースを連携させる事が出来ない。なに、このアイコン。Xcode 6.3には無いぞ!(T.T) あー[View]→[Assistant Editer]→[Show Assistant Editer]で出るね。グイッと。
よしビルド。ほうほう。動きますな。とりあえず、こういう風にすると、GUIとソースの連携が出来るのね。
ボタンを押したら、RealmのREST機能で、jsonをゲットしよう!
いきなり、難しい所を攻めてみる(苦笑)
環境は、こちら!
- Xcode 6.3.2 (6D2105)
- Realm Swift 0.93.1
import UIKit
import RealmSwift
class ViewController: UIViewController {
@IBOutlet weak var testLabel: UILabel!
@IBAction func downButton(sender: AnyObject) {
let url = NSURL( string: "http://search.twitter.com/search.json?lang=ja&rpp=20&q=%23AKB")!
let response = NSData(contentsOfURL: url)!
var buffer = [UInt8](count:response.length, repeatedValue:0)
response.getBytes(&buffer, length:response.length)
var datastring = String(bytes:buffer, encoding:NSUTF8StringEncoding)
testLabel.text = datastring
}
}
ボタンを押すと、REST連携でjson値をゲットして、testLabel が置換される"はず"!本来は、RealmのDB形式?に変換するんだろうけど、まだよく判らないから、こんな感じに。
そもそも冷静に考える。本当にRealmなのか!?
REST連携で、DBに格納しようとしているが、本当にその部分は必要なのか?
iOSアプリで、データを更新した場合、REST PUTで送信するのが良さそうなので、実装は無駄にならないが、MySQLからデータを抜き出す場合、そんなにデータ量も多くないので、一括ダウンロードでも良いかも。
このパターンは、既に第一線でiOSアプリを開発しているエンジニアの方から聞いた情報。iOSアプリのローカルDBに、登録・更新をおこなうより、.sqliteファイルをダウンロードした方が速くね!?って。
その実装形態は一理あるなー。
と、言うわけでRealm以外も調べてみる。
- FMDB : A Cocoa / Objective-C wrapper around SQLite
-
SwiftData : Simple and Effective SQLite Handling in Swift
の2つが有名らしい。Swiftだと、SwiftDataが良いようだ。 > SwiftでSQLiteを使う(SwiftData)
で、MySQLデータを簡単に、.sqlite ファイルに変換するのは、こちら > mysql2sqlite.sh
Swiftで非同期ダウンロードが出来るようにする方法も調べないと。
SwiftDataにハマりまくり
サンプル通り実装しているんだけど、値が取れない。なんでだーで、4時間を費やし、判ったことをまとめます。mysql2sqlite.shとの連携部分も多いけどね。
- なぜか、varchar のデータが取れない。SQLite って、varcharも許容しているんだけど、SwiftData は値で値が取れませんでした。MySQLのvarchar部分を、text型に変更して、逃げました。
- mysql2sqlite.shで、日本語が化ける。これは、ソース内の mysqldump で「--default-character-set=binary」をつけると良いみたい。
まあ、こんな感じ。まだまだ、初心者丸出しですね〜