[SQLite3] MacでSQLite。あとgccでコンパイル

2012/02/8

こんにちは。きんくまです。
SQLiteを業務で必要になったので調べてました。

SQLiteは1ファイルで手軽にデータベースが出来るものです。
そんで、iOSやAndroid、Adobe AIRなんかにも搭載されています。
この間、調べていて知ったのですが、SQLiteというのは、仕様というか規格なので、
iOSで作ったりしたものがAndroidやAIRで読み書きできます。その逆もまた可能。
jpegとかpngも機種依存しないのとおんなじですね。

terminal上で

MacにはSQLiteが標準で組み込まれています。
だから、すぐにデータベースを作れます。
下のはhello.dbという名前のデータベースを作るコードです。
でも、実際にファイルが作られるのは何らかのSQLコマンドが実行された後となります。

sqlite3 hello.db

やめたかったら、”.exit”と打ちます。

SQLiteの設定ファイルは ~/.sqliterc を使います。

.echo ON
.mode column
.headers ON
.nullvalue "NULL"

このファイルを置いておけば、スタート時に読み込まれます。

テーブルを作る

sqlite> create table hello (id integer primary key, message text);

行を追加

sqlite> insert into hello (message) values ('hello');

SQLiteの文字列には注意が必要です。
文字列はシングルクォートで囲んでおいた方が問題がないようです。

データを取得

sqlite> select * from hello;

一番基本的なterminalで打つSQLiteのコマンドたちでした。
これだけでもそれなりに開発できると思います。

それじゃあ、Cでもやってみます。

gccでSQLiteをコンパイル

gccに前から興味がありました。なんでかといいますと、
XCodeを使わないでどうやってCをコンパイルするのかなと思ってまして。
実際はXCodeの中ではgccが走っているみたいですけどね。
でも、わざわざXCodeのプロジェクトを作らんでも
小さめのソースとかだったら気軽にコンパイルできるのは良いのではないかと思いまして。

mysqlite1.c

#include <stdio.h>
#include <string.h>
#include "/usr/include/sqlite3.h"

int main(){
	sqlite3 *db;
	int result, id;
	sqlite3_stmt *stmt;
	char *sql, *name;

	result = sqlite3_open_v2("hello.db", &db, SQLITE_OPEN_READONLY, NULL);
	if(result != SQLITE_OK){
		printf("database opened\n");
		sqlite3_close(db);
		return 1;
	}

	sql = "select * from hello;";
	result = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL);

	if(result != SQLITE_OK){
		printf("statement error");
		return 1;
	}

	result = sqlite3_step(stmt);
	while(result == SQLITE_ROW){
		id = sqlite3_column_int(stmt, 0);
		name = (char *)sqlite3_column_text(stmt, 1);
		printf("id = %d, name = %s\n", id, name);
		result = sqlite3_step(stmt);
	}
	sqlite3_finalize(stmt);
	sqlite3_close(db);
	return 0;
}

MacにはSQLite3のライブラリが入ってますので、ヘッダーファイルをインクルードできます。
#include “/usr/include/sqlite3.h”

それじゃあ、terminalでコンパイルです。
うまくいくとmysqlite1という名前のファイルができています。

gcc -Wall -L/usr/lib/sqlite3 mysqlite1.c -lsqlite3 -o mysqlite1

試してみます。

./mysqlite1

makefileを使ってもコンパイルが可能です。
makefileは複数ファイルをコンパイルしたり、ライブラリをリンクしたりするのに便利です。

さきほどのコマンドはmakefileではこんな感じになります。

makefile

CC=gcc
CFLAGS=-Wall
all: mysqlite1

mysqlite1: mysqlite1.o
	$(CC) $(CFLAGS) -L/usr/lib/sqlite3 mysqlite1.o -lsqlite3 -o mysqlite1

mysqlite1.o: mysqlite1.c
	$(CC) $(CFLAGS) -c mysqlite1.c

clean:
	rm -f *.o mysqlite1

makefileを置いた後にこのコマンドを実行します。

make

うまくいけば、同じディレクトリにmysqlite1ができあがります。
cleanコマンドを実行すれば、オブジェクトファイル(*.o)とmysqlite1が削除されます。

make clean

より詳しく

この記事はこれらの本を参考にしています。
>> The Definitive Guide to SQLite
>> An Introduction to GCC: For the GNU Compilers GCC and G++

あとこのサイトも。
>> Makefiles by example


自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る