iPhoneでSQLite3を使う11(DBテーブルからUITableViewを表示)

DBテーブルからのUITableViewに表示する際に、データ数が多い場合に全部読み取るとメモリ消費も大きくなりますし、データに対して処理をする場合は時間もたくさんかかってしまいます。そのため、一度に読む量を区切り順番にページ送りして表示するようにページングを実装することが一般的です。
SQLite3でもありがたいことに、ページングをするためSELECT文にLIMIT句とOFFSET句が用意されています。

SELECT 列,列… FROM TABLE名 WHERE 条件 LIMIT 行数 OFFSET 開始行;

OFFSET句で開始行(何行目から取得するか)、LIMIT句で取得する行数を指定することができます。


それでは、実際に例を示すます。例では、ユーザテーブルより名前の読み順にページングを行います。
並び替えはORDER BY句を使います。列名を指定することで並び替えをしてくれます。ページングを行うまえに、並び替えや条件指定を行い、最終的に表示するイメージになるようにSELECT文を作成します。

SELECT name, yomi FROM user order by yomi;

SQLを発行すると、下記のイメージのように並びかわります。

でわ、次にページングのためのLIMIT句とOFFSET句を指定します。さきほど作成したSQL文をFROM句に指定して、下記のようのSQL文を作成します。
※ここがポイントです。サブクエリーというのですが、SELECT文のFROM句にはSELECT文を書くことができます。SELECT文の結果を、SELECT文の入力としてSQL文を発行することができるのです。

SELECT name, yomi FROM (SELECT name, yomi FROM user order by yomi) LIMIT 行数 OFFSET 開始行;

ページのサイズを10とすると
1ページ目の取得が、0行目(OFFSET)から10件(LIMIT)で

SELECT name, yomi FROM (SELECT name, yomi FROM user order by yomi) LIMIT 10 OFFSET 0;

2ページ目の取得が、10行目(OFFSET)から10件(LIMIT)で

SELECT name, yomi FROM (SELECT name, yomi FROM user order by yomi) LIMIT 10 OFFSET 10;

となります。取得イメージは、下記の通りです。

このように、順番にページを取得しUITableViewに追加していくことで、ページングを行うことができます。


サブクエリーは強力です。