読者です 読者をやめる 読者になる 読者になる

iphone,ipadでsqliteを使うとき。

iphone,ipadの開発をすることになりますた。
sqliteを使うためのクラスを自作で作ってみました。
FMDBつかってもよさそうだけど、どうなんだろう。。
coredataはめんどくさそうだし。。

以下、SQLiteを使うときの手順とソース

まずはライブラリの追加。Sqliteを使うためのライブラリを追加します。
トップページのtargetsから作っているAPPの名前を選んで、上部メニューからBuild Phasesを選ぶ。
Link Binary With Librariesの項目のプラスマークをおして、libsqlite3.0.dylibを追加します。

管理用クラスを追加するときはソースの入っているグループを右クリックして、New File -> objectiv-c class
でクラス名を入力して、SubClassをNSObjectにしておきます。

定義ファイル[UserDataManage.h] [code language="c"]

import <Foundation/Foundation.h>

import "sqlite3.h"

@interface UserDataManage : NSObject{ sqlite3 database; } -(void)createSql; -(void) insertUserScore:(NSInteger)score userName:(NSString)user_name; -(NSMutableArray *) getUserScore; -(int) getUserMaxRecode; @end [/code] 実装ファイル[UserDataManage.m] [code language="c"]

import "UserDataManage.h"

import "sqlite3.h"

define AppDbName @"score.db"

@implementation UserDataManage

  • (NSString )dataFilePath { NSArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:AppDbName]; } -(id)init{

} -(void) createSql{ if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Failed to open database"); }

NSString *createSQL =
@&quot;create table if not exists user_score &quot;
&quot;(id integer not null primary key, &quot;
&quot; name text,&quot;
&quot; score integer,&quot;
&quot; create_time text,&quot;
&quot; update_time text&quot;
&quot; );&quot;;
char *errorMsg;
if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &amp;errorMsg) != SQLITE_OK) {
    sqlite3_close(database);
    NSLog(@&quot;Error creating table: %s&quot;, errorMsg);
}

} -(NSMutableArray ) getUserScore{ //スコアテーブルの値取得 //NSString table_str[10]; NSMutableArray table_data = [[NSMutableArray alloc]init]; NSString query = @"select * from user_score order by score desc"; sqlite3_stmt statement; if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { for(int i = 0; sqlite3_step(statement) == SQLITE_ROW; i++) { //int id = sqlite3_column_int(statement, 0); //id char name = (char *)sqlite3_column_text(statement, 1); //name int score = sqlite3_column_int(statement, 2); //score

        //table_str[i] = [NSString stringWithFormat:@&quot;ユーザー名:%s  スコア:%d&quot;,name,score];
        NSString *str = [NSString stringWithFormat:@&quot;ユーザー名:%s  スコア:%d&quot;,name,score];
        [table_data addObject:str];
    }
    sqlite3_finalize(statement);
}
return table_data;

} -(void) insertUserScore:(NSInteger)score userName:(NSString)user_name{ char update = "insert into user_score (name, score) VALUES (?, ?);"; sqlite3_stmt *stmt; if (sqlite3_prepare_v2(database, update, -1, &stmt, nil)== SQLITE_OK) { NSLog(@"DBbind"); sqlite3_bind_text(stmt, 1,[user_name UTF8String], -1, NULL); sqlite3_bind_int(stmt, 2, score); }else{ NSLog(@"Not DBbind"); } if (sqlite3_step(stmt) != SQLITE_DONE) sqlite3_finalize(stmt);

 //sqlite3_close(database);

} -(int) getUserMaxRecode{ int max = 0; NSString query = @"select max(id) from user_score"; sqlite3_stmt statement; if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { for(int i = 0; sqlite3_step(statement) == SQLITE_ROW; i++) { max = sqlite3_column_int(statement, 0); } sqlite3_finalize(statement); } return max; } @end [/code]