iPhoneでSQLite3を使う1(SQLite起動とファイルの作成)

なぜいまさら、SQLiteなのか。それはCore Dataに挫折したからです。私がOracleとかSQL Serverに慣れ親しんでいるからというのもあるのですが、Core Data使いにくい。DB(データベース)を使ったことがない人はSQLが障壁になるのかもしれませんが、より複雑なこともできること、他の言語でも使えることが強みです。
やれることは、データを表形式に格納して永続化(アプリ終了しても残る=ファイルに保存)することができます。そしてその永続化データから、抜き出したり、並び替えることができます。それら操作を、行うのがSQLという言語です。だいたいのDBがこのSQLという言語を標準として作られていますので、一回勉強しておけば、サーバアプリを組むときにも使えます。ただし、方言があるためSQLite独自の関数などもあるため、SQLiteで使えるものが何なのかはリファレンスを参照ください。


では、SQLite語り尽くされているところですが、いまいちど初歩的なところからはじめたいと思います。
最初は起動ですね。SQLiteはターミナルから起動します。ターミナルを起動し、sqlite3と叩きます。

Last login: Sun Mar  6 00:08:08 on console
macmini:~ ovjang$ sqlite3
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

sqlite>」というプロンプトが起動され、コマンド待ち状態となります。この状態でSQLを発行したり、コマンドを発行することができます。
この状態で、「.help」と叩いてみましょう。

sqlite> .help
.backup ?DB? FILE      Backup DB (default "main") to FILE
.bail ON|OFF           Stop after hitting an error.  Default OFF
.databases             List names and files of attached databases
.dump ?TABLE? ...      Dump the database in an SQL text format
.echo ON|OFF           Turn command echo on or off
.exit                  Exit this program
.explain ON|OFF        Turn output mode suitable for EXPLAIN on or off.
 ・
 ・
 ・
.quit                  Exit this program
.read FILENAME         Execute SQL in FILENAME
.restore ?DB? FILE     Restore content of DB (default "main") from FILE
.schema ?TABLE?        Show the CREATE statements
.separator STRING      Change separator used by output mode and .import
.show                  Show the current values for various settings
.tables ?PATTERN?      List names of tables matching a LIKE pattern
.timeout MS            Try opening locked tables for MS milliseconds
.timer ON|OFF          Turn the CPU timer measurement on or off
.width NUM NUM ...     Set column widths for "column" mode

コマンドの一覧が表示されました。終了は、「.quit」みたいですね。叩いてみます。

sqlite> .quit

ターミナルに戻りました。バックアップとったり、SQLの実行時間を測るオプションかな?そんなのがありそうです。
DBを利用するには、まずDBファイルを作り、その中にさらにデータの入れ物にあたるテーブル(表)を作成します。ここまではターミナルでの作業です、さっそくファイルを作っていきましょう。
DBのファイルを作るには、さっきのsqlite3に引数でファイル名を渡して起動することで、DBファイルが作成されます。
とりあえず、twitterでのユーザ情報を保存するDBをサンプルに作成していきます。DBファイル名は、twitterDB.sqliteとしておきます。
ターミナルで「sqlite3 twitterDB.sqlite」と叩きます。

macmini:Sample06 ovjang$ sqlite3 twitterDB.sqlite
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> 

何も表示されません。確認するため、「.database」と叩いてみます。

sqlite> .database
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main             /Users/ovjang/Documents/Sample06/twitterDB.sqlite         
sqlite> 

お、ちゃんと作られているみたいです。
では、このままテーブルも作成していきます。テーブルは構造体の配列みたいなもので、これもSQLで作成します。作成は、CREATE TABLE文を使い、配列の要素名と型を指定することで作成することができます。
テーブル名をuserinfoとして、IDや名前などを要素とします。SQLはこんな感じです。

CREATE TABLE userinfo (
    'ID' integer,
    'name' text,
    'screen_name' text,
    'profile_image_url' text,
    'followers_count' integer,
    'friends_count' integer,
    'text' text
);

では、叩いてみます。

sqlite> .database
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main             /Users/ovjang/Documents/Sample06/twitterDB.sqlite         
sqlite> CREATE TABLE userinfo (
   ...>     'ID' integer,
   ...>     'name' text,
   ...>     'screen_name' text,
   ...>     'profile_image_url' text,
   ...>     'followers_count' integer,
   ...>     'friends_count' integer,
   ...>    'text' text
   ...> );
sqlite> 

確認するため、こんどは「.schema」と叩いてみます。

sqlite> .schema
CREATE TABLE userinfo (
    'ID' integer,
    'name' text,
    'screen_name' text,
    'profile_image_url' text,
    'followers_count' integer,
    'friends_count' integer,
    'text' text
);

これでテーブルの作成は、完了です。Objective-Cからテーブルの作成、削除もできますが。基本的にデータの構造は変わらないでしょう。表まではターミナルで作成して、表からのデータの出し入れだけをプログラムから行うというのが良いかと思います。