読書会(プログラミングAndroid)第5回議事録

[ 戻る ]


=====================================
 プログラミングAndroidを読む会第5回
=====================================

.. csv-table:: 開催概要

  "日時", "2012/11/24(土) 10:00-17:00"
  "場所", "川崎市教育文化会館 第3会議室"
  "出席者", "水越、今井、山中、村山、高橋(徹)、吉本、高橋(智)、岩室、遠藤、門脇(書記)"


10章 データの処理と永続化
=========================

10.3 SQL言語
------------

SQLiteにはCREATE DATABASE見たいなのはないのか?
 * ファイルがデータベースみたいなものなので、DBファイルを生成する=CREATE DATABASEというようなもの。
 * もちろんSQLiteにもCREATE DATABASEはあるはある。
 * 標準、たとえばSQL92にCREATE DATABASEってのはあるのか?
 * どうだろう。

(p.254上) 文末のセミコロンはSQL文に入る?
 * コマンドラインからは行末指定するから必要なのだろう。
 * でも純粋にたとえばJDBC経由で発行する際にセミコロンは必要?
 * SQL92とか的に必要なんだろうか。
  - spec読まないと分からないね。
  - SQLのspecは最新だとSQL:2011。
 * SQLite の http://sqlite.org/syntaxdiagrams.html によると sql-stmt にはセミコロンは含まれない。
  - sql-stmt-list を構成する際に ";" をはさむ。
 * http://en.wikipedia.org/wiki/SQL#Language_elements によるとセミコロンは
   SQL statements に含まれる。
    SQL statements also include the semicolon (";") statement terminator.
    Though not required on every platform, it is defined as a standard part of the SQL grammar.

(p.254) "PRIMARY KEYに指定された列は各行の識別子としてのみ使用される傾向に〜"
 * 本当にそう?
 * ベストプラクティス的に普及してる考え方。
 * リアルの識別情報(ナチュラルキー)とは別に機械生成したキーを使うほうが安全。
  - ナチュラルキーとサロゲートキー(orアーティフィシャルキー)
 * 実世界側の変更によって脆弱になるのを防ぐ。

そういえばER図に"ID"という項目(フィールド)を付ける?
 * 業務分析、ドメイン分析レベルだとサロゲートキーのIDは出てこない。
   実際の実装レベルで出てくる。
 * 分析モデルの図と、実装モデルの図ではリレーションの繋がりが異なる。
 * 論理モデルと物理モデルで別図を描くようなツールもある。
 * テーブルの設計は物理設計、で実際の実装につながるもの?
  - ER図はどのレベルで描く?
  - 論理モデルと物理モデル。
 * 話がループ。

FK (foreign key: 外部キー) の有り無し。
 * 論理モデルでリレーションがあろうが実装にはFKが無い(を付けない)こともある。
 * O/Rマッパーとか使うとFKが邪魔になるケースもある。
  - レコードの削除ができないとか。
  - 実行時最適化の結果、削除と追加の実行順序が逆転して制約に当たるとか。
 * 外部キーは"制約"だ、ということ。
   なのでO/Rマッパーなどのアプリケーション側で制約条件を担保できるなら、
   RDBMSの外部キーを使わないのはアリ。


10.3.2 SQLデータ操作コマンド
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(p.257) [余談] Acme, Coyote, ... 昔のアメリカのアニメのネタ
 * ロードランナー
 * RFC や (Windows 7などの) hosts ファイルなどにも登場する。
 * 色々なところに出てくる。
 * see http://en.wikipedia.org/wiki/Acme_Corporation

(p.258) UPDATE のコード
 ::

   where employer_id = (
   ... );

 * "=" で良いのか? "in" じゃない?
  - 副クエリの結果が1件ではないから "=" では駄目、のはず。
  - SQLiteなら通るのか?


10.3.3 データベースのそのほかの概念
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(p.259上) 推薦本はSQLiteの本?
 * 普通のSQLの本では?


10.3.4 データベーストランザクション
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(p.259) [typo]
"機能しなくたった場合、" → "機能しなくなった場合、" の誤植。


10.3.5 sqlite3を使ったデータベースの操作例
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(p.261 午前ここまで 2012/11/24 11:48)

(午後開始。2012/11/24 12:54)


10.4 SQLとデータベースを中心としたAndroidアプリケーション向けデータモデル
-------------------------------------------------------------------------

10.5 Androidデータベースクラス
------------------------------

10.6 Andoridアプリケーション向けのデータベース設計
--------------------------------------------------

10.6.1 SimpleVideoDbHelperクラスの基本構造
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(p.267) SQL文を外部ファイル化するのはWebアプリケーションなどではベストプラクティスなのか?
 * S2DAOなどだとビジネスロジック的な複雑なのは外出しすると楽。
 * 特にパフォーマンスチューニングとかの段階ではうれしい。
 * 開発ツールがJavaとSQLの両方(の文法)を同時に扱えないから、などの理由で違うファイルが嬉しいと言うことも無いわけでもない。
 * iBATISとかで外に書くことでDBMSを切り替えられたりとか。まれなケースだけれども。
 * マイナス面は?
  - コンパイラに通さないからコンパイル時にチェックがかからない。
  - ファイル名が間違ってるケースとかで、実行時まで分からないとか。
 * 一つのSQL文ですまない(検索項目を動的に生成するとか)のケースはどうなのか?
 * 複数のクエリを別の切り方の複数のクエリに書き直すとかのチューニングはどう?
  - 本当にメリットがあるのか?
  - ほぼ一つのクエリだけでチューニング済むケースが意外と多い。
  - 複数のクエリに手に入れないといけないようなケースはどの道両方(JavaコードとSQLクエリ)を直さないといけない。
    この場合は外出しのメリットは余り無い。
 * JavaEE3.1とかだとEJBに書くのはSQLではなくてEJBQLとかだったりもする。
  - それをソースコードに書くしかない。分離できない。
  - 今はJPQL(Java Persistent Query Language).
  - #HibernateのHQLとか。


10.7 データベースAPIの使用: MJAndroid
-------------------------------------

10.7.1 Androidとソーシャルネットワーキング
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

10.7.2 ソースフォルダ(src)
~~~~~~~~~~~~~~~~~~~~~~~~~~

10.7.3 アプリケーションのロードとスタート
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

10.7.4 データベースクエリとデータベースからのデータの読み取り
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(p.273) 辺りのソースコード
 (インデントがぼろぼろでございます...)

(p.275) "(8) ソート基準を交互に並べる簡単な方法。"
 * 交互に並べる?
 * 原文: "Simple way to provide alternate sort criteria: store the names of columns in an
   enum. This type is used in item 2."
  - 意訳気味にするなら "ソートの基準を選択可能にするシンプルな方法。" ?

CursorのSubclass化ってどうなの?
 * getCursor()して得たCursorに委譲でいいのでは?
 * (サブクラス化したほうが)コード量は減るけど、読みずらい。
  - 抽象化の度合いがバラツクのではないか。


10.7.5 データベースの修正
~~~~~~~~~~~~~~~~~~~~~~~~~

SQLite 以外のDBMSは?AndroidでJDBCは使えるのか?
 * APIには存在する java.sql.*, javax.sql.*
 * Type4のJDBCドライバがあればつながるのでは?
 * 動きそう?

(p.278) "nullColumnHack"
 * 全フィールド空の行が挿入できない、それってどう?
 * 空の行; 全カラムnull、SQL規格上できない?それともSQLiteではできない?
 * http://sqlite.org/nulls.html

(p.278) パラメータ化SQL
 * ?はupdate文のテーブル名とかの、order by の項目名とかのところをパラメータ化できないのか?
  - 無理ではないか?
  - テーブル名をパラメタ指定。
    似た構造の複数のテーブルにアクセスしたいときとか。(年度別テーブル! とか)

(p.279) "db.editJob((long) job_id, ...);"
 * (long)へのキャストは必要?

(p.280上) "... whereArgs = new String[] {Long.toStirng(job_id)};"
 * なぜnew String[]{}?
  - SQLiteDatabase#update( , String[]);
  - SQLiteDatabase#execSQL(, Object[]);
  - update() の中で parseInt() とかしているのではないか?
   + (内部で) テーブルの定義を見て組むのか、引数の型を見て組むのか。
 * SQLiteの実装的には型があるようでないから、実際にこれで困らないのでは。割といい加減。
   INTEGERのフィールドにも文字列が入れられる。
   see http://sqlite.org/datatype3.html

(p.280) "_id = ?"
 * の ? に 1234 を入れるとどう比較するの?
 * "123.0" を入れると文字になる?数値になる?
  - see http://sqlite.org/datatype3.html
 * "SQLite、型" でwebを検索
 * CREATE TABLE時などのSQL文中での型指定
  - INTとか含まれてればINTEGERに
  - TEXT,CHARとか含まれていればTEXTになる。
  - CHARINTは?
   + 次のオーダーで確認、INTEGER, TEXT, NONE, REAL, NUMERIC。
     というかこれも上記のSQLiteのサイトにある。
 * 比較時の型変換やソート順序についても。
  - see http://sqlite.org/datatype3.html !!

SQLiteでのdatetime型は?
 * INTEGER,TEXT,などへの変換関数があるので、それで適切な型に変換してから格納。
 * SQLの中にstrftimeとかあるらしい。
 * unix-timeとかJulian-dayとか。必要と型に応じて。



3部 Androidのスケルトンアプリケーション
=======================================

11章 振る舞いのよいアプリケーションのためのフレームワーク
=========================================================

11.1 ライフサイクルの視覚化
---------------------------

(p.286) Log.i(...);
 * ログをどうする。出力したくないときとか。
 * 文字の結合とかしてるのが重い。
  - Log.i()の呼び出しをラップする。
  - 呼び出し側で Log.isLoggable(String, int) を使う?
  - cppのプリプロセッサを使う。(#ifdef ...)
  - アノテーションプロセッサ。
  - staticフィールドで切り替えなら、もしかしたらobfuscaterが除いてくれるかも。
  - debug/releaseビルドの切り替え機能は?
  - ログの引数をラムダでもらえ(れ)ば、引数の処理はラムダ評価しなければ軽くなる!!
   + あとはLogの呼び出しのみ。
   + lambda が使えればね ;-p

(p.294) finishって?
 * 明示的に終了する時に呼び出すメソッド。

(p.296) テンキーの9?
 CTRL-F12ではなくて?

(p.296) rotateでアクティビティを破棄する?
 * AndroidManifest.xmlで設定できるはず。
  - <activity android:configChanges=".." > を設定する。
  - see https://developer.android.com/guide/topics/manifest/activity-element.html
  - see https://developer.android.com/guide/topics/resources/runtime-changes.html

(p.297) onRetainNonConfigurationInstance?
 ちょっと何が言いたいのか良く分からないですね。



次回
================

p.298 11.2 から。


[ 戻る ]