40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

006-Mac標準で利用できるsqlite3を使ったDB処理

Unit Testについて書こうと思っていたのですが、DB接続処理で所々はまっているのでそちらについてしばらく触れておきます。

Mac標準で利用できるsqlite3でデータベースの準備

Mac OS X. 10.6 Snow LeopardでSQLite3を動かしてみたよ。のページを参考にしてまずは

  • データベース作成
  • テーブル作成
  • テストデータ登録

というのを試しました

$ sqlite3 main.db 
SQLite version 3.7.3
sqlite> create table DATABASETEST (ID INTEGER, NAME TEXT);
sqlite> insert into DATABASETEST values(1,'Test 1');

テストデータ登録する時に、日本語の登録がうまく出来ずちょっと調べたらsqlite3へ日本語データを入れるにいきあたり、CSVファイルを読む込む形にすれば解決できるようでした。

そのため、このようなCSVファイルを準備

1,Japanese
2,English
3,Korian
4,Chinese
5,日本語
6,英語
7,韓国語
8,中国語

そして、下記のようにしたら問題なく日本語も登録できました

$ sqlite3 dataset.db
SQLite version 3.7.3
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .separator ,
sqlite> create table DATABASETEST (ID INTEGER, NAME TEXT);
sqlite> .import data.csv DATABASETEST
sqlite> select * from DATABASETEST;
1,Japanese
2,English
3,Korian
4,Chinese
5,日本語
6,英語
7,韓国語
8,中国語

Titaniumで、sqlite3のDBからデータを読み込む

KitchenSinkのソースをみながらこんな感じのサンプルをつくってみました。

var win1 = Titanium.UI.createWindow({
    title:'Tab 1',
    backgroundColor:'#fff'
});
var tab1 = Titanium.UI.createTab({
    icon:'KS_nav_views.png',
    title:'Tab 1',
    window:win1
});
var label1 = Titanium.UI.createLabel({
	color:'#999',

	font:{
	  fontSize:20,
	  fontFamily:'Helvetica Neue'
	},
	textAlign:'center',
	width:'auto'
});

win1.add(label1);
var l2 = Titanium.UI.createLabel({
  text:'unicode placeholder',
  width:300,
  height:40,
  top:160
});
win1.add(l2);

/*
 * DB connection
 *
 */
var db = Titanium.Database.install('./dataset.db','quotes');
var rows = db.execute('SELECT * FROM DATABASETEST ORDER BY ID');

while (rows.isValidRow()){
  Titanium.API.info(
    'ID: ' + rows.field(0)
    + ' NAME: ' + rows.fieldByName('name')
    + ' COLUMN NAME ' + rows.fieldName(0)
  );
  // DBに格納されている値を、label2に格納
  if (rows.fieldByName('ID')===6) {
    l2.text = rows.fieldByName('name');
  }
  rows.next();
}
rows.close();
db.close();

日本語が含まれているデータを表示しようとするとうまく表示できない。
console
[INFO] ID: 1 NAME: Name 1 COLUMN NAME id
[INFO] ID: 2 NAME: Name 2 COLUMN NAME id
[INFO] ID: 3 NAME: Name 3 COLUMN NAME id
[INFO] ID: 4 NAME: KS_nav_ui.png KS_nav_views.png app.js app.js~ database_2.js database_2.js~ default_app_logo.png iphone main. COLUMN NAME id
[INFO] ID: 5 NAME: KS_nav_ui.png KS_nav_views.png app.js app.js~ database_2.js database_2.js~ default_app_logo.png iphone main. COLUMN NAME id
[INFO] ID: 6 NAME: Name6 COLUMN NAME id

次回書く/書きたい内容

日本語が含まれるsqlite3のデータベースからデータを読み込む方法について書きたい
※上記Titaniumのコンソール画面のメッセージを読むかぎり、Titanium.Database.install('./dataset.db','quotes')で指定しているデータベースではなく、違うものを読み込んでいるように見えるので、それが原因だと思うんだけどなぁ。。