[PR]
2025年06月18日
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
セルの高さ
2008年12月09日
テーブルの各セルの高さを変えたい場合はheightForRowAtIndexPathで指定します。これまでと同様にindexPathの値で場合分けをしてゆくと良いでしょう。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0) {
if(indexPath.row == 0) {
return 80; // 一番上のセクションの一番上の行の高さは80ピクセルにします。
}
} else if (indexPath.section == 1) {
return 60; // 二番目のセクションの行の高さは全て60ピクセルにします。
}
return 45; // 上で指定しなかった全てのセクション・行の高さは全て45ピクセルにします。
return 45; // 上で指定しなかった全てのセクション・行の高さは全て45ピクセルにします。
}
PR
Kigen 1.5.0リリース
2008年11月25日
Kigen ver1.5.0が無事承認されました。ネットワーク利用のプログラムが承認されるかどうか不安でしたが、あまりおかしなことをしていなければ承認されるみたいですね。ひと安心です。久しぶりにiTunes Storeを覗いてみたところ、日本語のレビューが掲載されていました。目を通してみると…List Viewでno nameが表示されたそうですね…
no nameの問題はデータベースの更新で私がポカをやってたせいです。ごめんなさい。具体的には編集で名前を変えた時にソート処理を入れ忘れていたんです。そのせいで、内部にある名前管理用のデータベースと期限管理用のデータベースの同期が不完全になり、宙ぶらりんになってしまっていたのです。一度こうなると最悪の場合ゴミとしてList Viewに残り続けてしまうのです。List Viewから削除する機能は近日中に追加します。ちなみに、現バージョンで新たにno nameが発生することはないはずです。
no nameの問題はデータベースの更新で私がポカをやってたせいです。ごめんなさい。具体的には編集で名前を変えた時にソート処理を入れ忘れていたんです。そのせいで、内部にある名前管理用のデータベースと期限管理用のデータベースの同期が不完全になり、宙ぶらりんになってしまっていたのです。一度こうなると最悪の場合ゴミとしてList Viewに残り続けてしまうのです。List Viewから削除する機能は近日中に追加します。ちなみに、現バージョンで新たにno nameが発生することはないはずです。
SQL文への変数組み込みと検索結果取り出しの関数
2008年11月22日
データベースで各列に使うデータ型は主にint、real、charですが、それらをプログラム側とやり取りする時は以下のような感じになります。それぞれプログラム内の変数は
SQL文の?に埋め込む場合
データを取り出す場合
int aInteger;
double aDouble;
NSString *aString;
という場合です。double aDouble;
NSString *aString;
SQL文の?に埋め込む場合
sqlite3_bind_int(st, 1, aInteger);
sqlite3_bind_double(st, 2, aDouble);
sqlite3_bind_text(st, 3, [aString UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_double(st, 2, aDouble);
sqlite3_bind_text(st, 3, [aString UTF8String], -1, SQLITE_TRANSIENT);
データを取り出す場合
aInteger = sqlite3_column_int(st, 0);
aDouble = sqlite3_column_double(st, 1);
aString = (char *)sqlite3_column_text(st, 2);
aDouble = sqlite3_column_double(st, 1);
aString = (char *)sqlite3_column_text(st, 2);
SQL文に変数を組み込んで利用する方法
2008年11月22日
以前にSQL文がそのまま検索に使用できる時の流れは書いていますが、検索条件をプログラム内で変更したい場合も当然出てきます。その場合の方法です。説明のため、またKigenの一部ソースを引っ張ってきて手を加えています。
NSInteger level1 = 1;
sqlite3_stmt *st;
const char *sql2 = "SELECT pk FROM kigen WHERE level1=?";
if (sqlite3_prepare_v2(database, sql2, -1, &st, NULL) == SQLITE_OK) {
NSInteger level1 = 1;
sqlite3_stmt *st;
const char *sql2 = "SELECT pk FROM kigen WHERE level1=?";
if (sqlite3_prepare_v2(database, sql2, -1, &st, NULL) == SQLITE_OK) {
NSLog(@"sql文の準備完了");
sqlite3_bind_int(st, 1, level1);
sqlite3_bind_int(st, 1, level1);
while (sqlite3_step(st) == SQLITE_ROW) {
以前の例とどこが違うかというと、まずSQL文の中に?があります。これが後で変数が放り込まれる部分です。SQL文ではkigenテーブルからlevel1列の内容が?である行でpk列に入っている内容を表示するように指示しています。そして次に違うのがsqlite3_bind_intという命令が準備が終わって実際に検索を行うまでの間に挿入されている点です。この命令で、stがポインタになっているSQL文の1個目の?にlevel1という整数の変数を代入するように指示しています。?が何個もある場合には、その数だけsqlite3_bind_intなどの命令が入るわけです。
データベースファイルの作成方法 その3 データの入力
2008年11月22日
作成の最終段階、実際のデータ入力です。ホームのファイルは前回のまま残っているものとします。
ものすごく簡略化していますが、基本的なデータファイルの作成方法はこんな感じです。自分で使いたいデータベースの形によって、テーブルに含める列の数やデータ型等を工夫してみましょう。作成したデータファイルはホームから自分のプロジェクトフォルダにコピーして、プロジェクトのリソースにはXcode上で追加>既存のファイル...で組み込みます。
ちなみに、上の例でpkに指定しているprimary keyというのは、各行で決して重複した値をとれないように制限を設ける設定です。上の例でもしxyzを入れるとき、pkを1にしていたらabcの行とかぶるのでエラーが出て入力できません。この設定は、データベース内のある行の値を変更したいという場合に利用できます。変更を行う場合、複数行を同時に変更するような命令は受け付けられません。そこで確実にデータベースの1行だけを狙い撃ちで指定できるprimary key設定された列があると便利なのです。なお複数行の変更は該当するpkのリストを作り、1行ずつ変更します。
- 前回と同様、ターミナルでsqlite3 test.sqlと入力しEnterを押します。
- insert into namae(pk,name) values (1,'abc');と入力しEnterを押します。nameとして"abc"という値を持つ行が作られます。
- 同様にinsert into namae(pk,name) values (2,'xyz');と入力しEnterを押します。さらに"xyz"という値を持つ行が作られました。
- では確認してみましょう。select * from namae;と入力してEnterを押してください。これで2行のデータが表示されていれば、入力は成功しています。
- .quitと入力しEnterを押して終了します。
ものすごく簡略化していますが、基本的なデータファイルの作成方法はこんな感じです。自分で使いたいデータベースの形によって、テーブルに含める列の数やデータ型等を工夫してみましょう。作成したデータファイルはホームから自分のプロジェクトフォルダにコピーして、プロジェクトのリソースにはXcode上で追加>既存のファイル...で組み込みます。
ちなみに、上の例でpkに指定しているprimary keyというのは、各行で決して重複した値をとれないように制限を設ける設定です。上の例でもしxyzを入れるとき、pkを1にしていたらabcの行とかぶるのでエラーが出て入力できません。この設定は、データベース内のある行の値を変更したいという場合に利用できます。変更を行う場合、複数行を同時に変更するような命令は受け付けられません。そこで確実にデータベースの1行だけを狙い撃ちで指定できるprimary key設定された列があると便利なのです。なお複数行の変更は該当するpkのリストを作り、1行ずつ変更します。
データベースファイルの作成方法 その2 テーブルの作成
2008年11月22日
前回は何もしていないので、今度はテーブルを作成します。
ファイルはホームに作られています。Finderで確認してみてください。ファイルはテーブルを作った時点で作成されます。
- 前回同様にターミナルを起動します。
- 今度はsqlite3 test.sqlと入力してEnterを押します。test.sqlを作りたいことが伝わります。
- create table namae(pk int primary key, name char);と入力してEnterを押します。これでnamaeという名称のテーブルが作られます。pk int primary keyで、テーブルに行ごとに別の整数を持つpkという名称の列を作ること、name charでnameという名称の文字列を格納する列を作ることを指示しています。データの型には他に浮動小数点型のrealなどがあります。
- 確認のため、.tableと入力してEnterを押します。namaeと表示されていれば、テーブルが作られています。
- 次に.schema namaeと入力してEnterを押します。namaeテーブルを作成した時の命令が表示されます。これでテーブル内の列にどのようなデータ型を指定したか確認できます。
- 今回はここまで、ということで.quitと入力しEnterを押します。
ファイルはホームに作られています。Finderで確認してみてください。ファイルはテーブルを作った時点で作成されます。
データベースファイルの作成方法 その1 SQLite3の起動
2008年11月22日
データベースファイルを作成する方法です。まずは基礎の基礎、SQLite3の起動と終了から。
iPhone SDKがインストールされている環境なら追加でインストール等を行わなくてもSQLite3は起動するはずですが、念のための確認です。
- Finderで場所からアプリケーションを選びます。
- ユーティリティのターミナルを選びます。
- sqlite3と入力しEnterを押します。SQLite Version 〜と表示されれば起動成功です。
- .quitと入力しEnterを押すと終了します。
- ターミナルを閉じます。
iPhone SDKがインストールされている環境なら追加でインストール等を行わなくてもSQLite3は起動するはずですが、念のための確認です。
文字列のローカライズ
2008年11月22日
各言語に応じて表示内容を変えたい場合
プロジェクトの入っているフォルダ(*.xcodeprojが入ってるフォルダ)内にフォルダを作ります。フォルダ名は英語ならEnglish.lproj、日本語ならJapanese.lprojです。
それぞれのフォルダの中にLocalizable.stringsという名前のテキストファイルを作っておきます。
実際のプログラム内で、言語毎に変える文字列をNSLocalizedStringを使って書きます。
例:cell.text = NSLocalizedString(@"Add new category", @"Level1 add new text");
@"Add new category"がLocalizable.strings内部を探す際のキーワードになります。@"Level1 add new text"の方は自分が何のために書いたか思い出すためにつけておくラベルなので、何でもよいみたいです。多分@""でも問題ないはずです。そして、先ほどの各言語フォルダのLocalizable.stringsに、キーワードに対応させる行を加えておきます。
English.lproj内のLocalizable.strings
"Add new category" = "ADD NEW CATEGORY!";
Japanese.lproj内のLocalizable.strings
"Add new category" = "新カテゴリ";
こうしておくと、上に書いたNSLocalizedString命令の実行結果として、デバイスの言語設定が英語の場合はADD NEW CATEGORY!が返り、日本語の場合は新カテゴリが返ります。ローカライズ用のフォルダを作っていない他の言語の場合はどうなるかというと、NSLocalizedStringの1個目の引数であるAdd new categoryがそのまま返ります。また、各言語のLocalizable.strings内に一致するキーワードが無い場合も同様にNSLocalizedStringの1個目の引数であるAdd new categoryがそのまま返ります。上の例では理解しやすいように英語の場合に入る文字列を大文字にしていますが、
"Add new category" = "Add new category";
としていても何の問題もありません。この場合我々には全く見分けはつきませんが、実際にはイコールの右側にあるAdd new categoryが返っています。
プロジェクトの入っているフォルダ(*.xcodeprojが入ってるフォルダ)内にフォルダを作ります。フォルダ名は英語ならEnglish.lproj、日本語ならJapanese.lprojです。
それぞれのフォルダの中にLocalizable.stringsという名前のテキストファイルを作っておきます。
実際のプログラム内で、言語毎に変える文字列をNSLocalizedStringを使って書きます。
例:cell.text = NSLocalizedString(@"Add new category", @"Level1 add new text");
@"Add new category"がLocalizable.strings内部を探す際のキーワードになります。@"Level1 add new text"の方は自分が何のために書いたか思い出すためにつけておくラベルなので、何でもよいみたいです。多分@""でも問題ないはずです。そして、先ほどの各言語フォルダのLocalizable.stringsに、キーワードに対応させる行を加えておきます。
English.lproj内のLocalizable.strings
"Add new category" = "ADD NEW CATEGORY!";
Japanese.lproj内のLocalizable.strings
"Add new category" = "新カテゴリ";
こうしておくと、上に書いたNSLocalizedString命令の実行結果として、デバイスの言語設定が英語の場合はADD NEW CATEGORY!が返り、日本語の場合は新カテゴリが返ります。ローカライズ用のフォルダを作っていない他の言語の場合はどうなるかというと、NSLocalizedStringの1個目の引数であるAdd new categoryがそのまま返ります。また、各言語のLocalizable.strings内に一致するキーワードが無い場合も同様にNSLocalizedStringの1個目の引数であるAdd new categoryがそのまま返ります。上の例では理解しやすいように英語の場合に入る文字列を大文字にしていますが、
"Add new category" = "Add new category";
としていても何の問題もありません。この場合我々には全く見分けはつきませんが、実際にはイコールの右側にあるAdd new categoryが返っています。