こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLiteでデータをアプリから追加する方法

ObjectiveCを用いてiPhoneアプリ製作の勉強をしています。

SQLiteを使って、データをアプリから追加したいのですが、その処理をするコードの記述方法が分かりません。

NSString *sql = @"CREATE TABLE IF NOT EXISTS members (year INTEGER PRIMARY KEY,month INTEGER,day INTEGER);";

NSString *insert_sql = @"INSERT INTO members (year,month,day) VALUES(?,?,?)”;

NSString *select_sql = @"SELECT year,month,day FROM members”;

特に以上3行の処理の記述方法が分からず、自分なりに考えてこのように記述し試してみましたが
storyboard上に追加したボタンを押してDataMakeメソッドを実行するときに
”EXC_BAD_ACCES”というエラーが出てしまいました。

以下にコードを晒します。

■ViewController.h
yearF,monthF,dayFをプロパティ宣言しています。

■ViewController.m
#import "ViewController.h"
#import "FMDatabase.h"

@interface ViewController ()

- (IBAction)DataMake:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

NSString *db_path = [self sqlmethod];

NSLog(@"%@",db_path);



FMDatabase *db = [FMDatabase databaseWithPath:db_path];



NSString *sql = @"CREATE TABLE IF NOT EXISTS members (year INTEGER PRIMARY KEY,month INTEGER,day INTEGER);";

[db open];

[db executeUpdate:sql];

[db close];
}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (NSString*) sqlmethod{

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

NSString *dir = [paths objectAtIndex:0];

return [dir stringByAppendingPathComponent:@"dayData.db"];
}

- (IBAction)DataMake:(id)sender {

NSString *db_path = [self sqlmethod];



FMDatabase *db = [FMDatabase databaseWithPath:db_path];

NSString *insert_sql = @"INSERT INTO members (year,month,day) VALUES(?,?,?)";

_yearF = 2014;
_monthF = 3;
_dayF = 23;

[db open];

[db executeUpdate:insert_sql,@"%d",_yearF,@"%d",_monthF,@"%d",_dayF];

[db close];

[self dataopen];
}

-(void)dataopen

{

NSString *db_path = [self sqlmethod];

FMDatabase *db = [FMDatabase databaseWithPath:db_path];

NSString *select_sql = @"SELECT year,month,day FROM members";

[db open];

FMResultSet *result = [db executeQuery:select_sql];


while ([result next]) {

int result_year = [result intForColumn:@"year"];

NSLog(@"recodeyear[%d]",result_year);

}
}

@end


以下のリンクを参考にし、”SQLiteを使用するためのライブラリ「libsqlite3.0.dylib」を追加”という項目までは出来ています。
http://blog.oukasoft.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/%E3%80%90iphone%E3%82%A2%E3%83%97%E3%83%AA%E3%80%91sqlite%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%81fmdb%E3%80%81lita/

投稿日時 - 2014-03-23 18:14:52

QNo.8525732

すぐに回答ほしいです

質問者が選んだベストアンサー

ちょっと気がついたので追伸します。
> NSString *sql = @"CREATE TABLE IF NOT EXISTS members (year INTEGER PRIMARY KEY,month INTEGER,day INTEGER);";
の「PRIMARY KEY」は削除して
@"CREATE TABLE IF NOT EXISTS members (year INTEGER ,month INTEGER,day INTEGER);"
とする必要があると思います。

「PRIMARY KEY」が指定されたフィールドは、重複した値を持つことができません。
これでは同じ年の日付を複数登録できません。
年月日の組み合わせで検索することが多いなら年月日をセットでプライマリーキー指定するよう
@"CREATE TABLE IF NOT EXISTS members (year INTEGER ,month INTEGER,day INTEGER ,PRIMARY KEY(year,month,day));"
とした方がよいかもしれません。
(参考)
http://www.dbonline.jp/sqlite/table/index6.html

上記の通りコーディング修正した後、一旦データベースを削除する必要があります。
削除処理をコーディングするのが面倒なら、一旦シミュレータまたは実機から
アプリを削除して、再実行するだけでよいと思います。

投稿日時 - 2014-03-24 21:48:42

お礼

回答ありがとうございます!
使ったことのないものに対してまで助言をいただき本当に助かります><
ご指摘のとおりコードを組み実行したところ、データベースの作成ができ、確認用のログもきちんと表示することが出来ました。
カレンダーに組み込むことも出来たのでだいぶそれっぽい形になってきました^^

投稿日時 - 2014-03-25 06:09:15

このQ&Aは役に立ちましたか?

18人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

FMDBは使ったことないのですが、紹介されたURLを見る限り
[db executeUpdate:insert_sql,@"%d",_yearF,@"%d",_monthF,@"%d",_dayF];
が誤っていると思います。

ここは、insert_sqlに記述されているINSERT INTO文の"?"になっている箇所に
設定するオブジェクトを指定するのだと思います。
例を見る限りINTEGER型には数値文字を指定するようですので

[db executeUpdate:insert_sql,
[NSString stringWithFomat:@"%d",_yearF],
[NSString stringWithFomat:@"%d",_monthF],
[NSString stringWithFomat:@"%d",_dayF]
];
という感じでいけるのではないかと思います。

もしかしたら
[db executeUpdate:insert_sql,@(_yearF),@(_monthF),@(_dayF)];
だけでもいけるかもしれません。

3行のSQL文は、おそらく問題ないと思います。

もしはずれていたら、
”EXC_BAD_ACCES”のエラーが、DataMakeメソッド内のどの行を実行した時に
表示されるのかを補足してください。

投稿日時 - 2014-03-24 21:18:36

あなたにオススメの質問