実録、ともおじちゃん

典型的な客先常駐型ソフトウェア技術者の13年の軌跡

Symbian DBMS

2005年11月30日 | コンピュータ・家電
現在、仕事で作成しているFOMA M1000用のアプリケーションにファイルベースのデータベースを操作する機能を実装するため、思考錯誤していたら、終電間際になって、タイムアップ。帰宅したら、もう、日付が変わってました。

ファイルベースのデータベース(Symbianのtechlibによれば、正式にはClient-side accessと呼ぶらしい)で、次のようなコードを書いてみたところ、 KErrNotSupport がリーブしてしまいます。
 _LIT(KDbFileName, "c:sample.db");

 RFs fs;
 User::LeaveIfError(fs.Connect());
 CleanupClosePushL(fs);

 RDbNamedDatabase ndb;
 User::LeaveIfError(ndb.Create(fs, KDbFileName);
 CleanupClosePushL(ndb);

 _LIT(KMkTable, 
  "CREATE TABLE table (
    id    VARCHAR (255) PRIMARY KEY, 
    name  VARCHAR (8)   UNIQUE)");

 User::LeaveIfError(ndb.Execute(KMkTable));
 
 CleanupStack::Pop();
 ndb.Close();

 CleanupStack::Pop();
 fs.Close();

どうも、CREATE TABLE では列制約に NOT NULL しか指定できないようで、それに気づくに時間がかかりました。仕方がないので、table 表の各列に NOT NULL を設定し、
 _LIT(KMkTable, 
  "CREATE TABLE table (
    id    VARCHAR (255) NOT NULL, 
    name  VARCHAR (8)   NOT NULL)");

PRIMARY KEY の代わりに一意なインデックスを作成しようとして、
 _LIT(KUniqueIndex,
  "CREATE UNIQUE INDEX table_index ON table (id)");
 
 User::LeaveIfError(ndb.Execute(KUniqueIndex));

とすると、今度は KErrTooBig がリーブしてしまい、踏んだり蹴ったり。
代わりに
 _LIT(KUniqueIndex,
  "CREATE UNIQUE INDEX table_index ON table (name)");
 
 User::LeaveIfError(ndb.Execute(KUniqueIndex));

とすると、ちゃんとインデックスが生成されます。
何が Too Big なのか、う~ん、わからん。

SQLだけでは、列に PRIMARY KEY 制約を付けられないのでしょうか。参りました。

最新の画像もっと見る