自己紹介

自分の写真
最近、iphoneアプリをリリースしました。
UxU
無料アプリですので、是非遊んで下さい。 第二弾アプリ:工場夜景写真集 今後も色々なアプリをリリースしていく予定です。
次は、コスプレ or 漫画 or 騎乗日記

2011年4月10日日曜日

SQLiteについて(iphoneとandroidの違い)

更新がないようなデータをアプリで扱う場合の仕組みには、
plistで保存、CoreDataで保存、sqliteで保存があります。
データが少ない場合は、plistで保存でも良いと思います。
データ量が多く、高速に検索したい場合は、CoreDataを使うと良いと思います。
今回のSQLiteは、androidでも使う事が可能・iphoneでも扱う事が可能な事と
RDBとほど同様にアクセスが可能な点です。
これにより、今までSQLを扱った事のある人には、短納期で実装が可能となるメリット
あります。


iphoneでSQLiteを仕様する場合は、
Frameworkに「libsqlite3.0.dylib」を追加することで使用することが可能になります。

(※ちなみに、androidの場合は、SQLiteOpenHelper」クラスを使用します。)



具体的には、
#import を書く事でsqliteクラスが利用できます。

sqlite3 *database;
// DBのオープン
if (sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK)
{
// SQL文の定義
char *sql = "
select * from test";
// SQLを実行して結果を取得
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
// 取得件数分繰り返し
while(sqlite3_step(statement) == SQLITE_ROW) {

// 数値項目 A(0番目の項目) の取得
NSInteger a = sqlite3_column_int(statement, 0);
// 文字列項目 B(1番目の項目) の取得
NSString *b = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];

// コンソールに結果を表示
NSLog(@"id:%d, name:%@", a, b);
}
sqlite3_finalize(statement);
}
// DBのクローズ
sqlite3_close(database);
}


というような感じですが、
一番面倒なのがプリペアドステートメント機構が使うヅライ点です。


それを補ってくれるフレームワークがあります。
FMDBです。
(上記のリンクからダウンロードして下さい。githubに繋がっています。)
----------------------------------
メリット:コーディング量が劇的に少なくなる。
メリット:SQLだけ考えれば済む


具体的には、ダウンロードして以下のファイルを自分のプロジェクトにコピーして下さい。
-----
FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMResultSet.h
FMResultSet.m
--------
そして、使用方法は、

FMDatabase* db = [FMDatabase databaseWithPath:dbpath];
if ([db open]) {
[db setShouldCacheStatements:YES];
 // INSERT
[db beginTransaction];
int i = 0;
while (i++ < 20) {
[db executeUpdate:@"INSERT INTO TEST (id,name) values (?,?)"
   ,
[NSNumber numberWithInt:i], [NSString stringWithFormat:@"name is %d", i]];
if ([db hadError]) {
NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
}
}
[db commit];
// SELECT
FMResultSet *rs = [db executeQuery:@"select * from test"];
while ([rs next]) {
NSLog(@"id:%d name:%@", [rs intForColumn:@"id"], [rs stringForColumn:@"name"]);
}
[rs close];
[db close];
}

どうでしょうか?
明らかに、fmdbの方が理解しやすいですよね。


androidの場合は、こうなります。
--------------------
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

DatabaseHelper helper = new DatabaseHelper(this, "test.db");

SQLiteDatabase db = helper.getReadableDatabase();

Cursor c = db.rawQuery("
select * from test;", null);
if(c.getCount() > 0){
// 最初の行に移動
c.moveToFirst();

Log.d("id:", c.getInt(0));
Log.d("name:", c.getString(1));

// 次の行に進む場合はc.moveToNext()
}
c.close();

まとめ

----
SQL文に関しては、完全に同じだと言う事がわかると思います。
クロスプラットフォームで、データを扱いたい場合は、SQLiteがオススメだと
思います。

0 件のコメント:

コメントを投稿