iPhoneでSQLite3を使う5(データの追加と更新)

今回は、追加と更新についてです。SQLではINSERT文とUPDATE文を使います。


INSERT文の例
INSERT文では、どのテーブルにどんな値を追加したいかを記述します。列の個数と列の順番にあわせて値を記述します。

INSERT INTO テーブル名 VALUES (値, 値, 値, 値…)



UPDATE文の例
UPDATE文では、どのテーブルのどの列をどんな値で更新したいかを記述します。また、更新するときにこんなデータだけ更新するという、条件をつけることもできます。条件を指定しない場合は、すべての行を指定した値で更新します。

UPDATE テーブル名 SET 列=値, 列=値, 列=値,… WHERE 条件



Objective-Cでの実装を書くと下記のようになります。つかっているメソッドは同じなので、説明は省きます。

sqlite3_stmt* statementUpdate_;
sqlite3_stmt* statementInsert_;

-(BOOL)usersInfoInsert:(userInfo*)userInfo {
	sqlite3_reset(statementInsert_);
	sqlite3_bind_text  (statementInsert_, 1, [userInfo.ID UTF8String], -1, SQLITE_TRANSIENT);
	sqlite3_bind_text  (statementInsert_, 2, [userInfo.Name UTF8String], -1, SQLITE_TRANSIENT);
	sqlite3_bind_text  (statementInsert_, 3, [userInfo.ScreenName UTF8String], -1, SQLITE_TRANSIENT);
	sqlite3_bind_text  (statementInsert_, 4, [userInfo.ProfileImageUrl UTF8String], -1, SQLITE_TRANSIENT);
	sqlite3_bind_double(statementInsert_, 5, [userInfo.FollowersCount doubleValue]);
	sqlite3_bind_double(statementInsert_, 6, [userInfo.FriendsCount doubleValue]);
	sqlite3_bind_text  (statementInsert_, 7, [userInfo.Text UTF8String], -1, SQLITE_TRANSIENT);
	int wasSucceeded = sqlite3_step(statementInsert_);

	if( wasSucceeded != SQLITE_DONE ) {
		NSLog( @"Failed to insert from database with '%s'.", sqlite3_errmsg( db_ ));
		return NO;
	}
	return YES;
}

-(BOOL)usersInfoUpdate:(Friend*)userInfo {
	sqlite3_reset(statementUpdate_);
	sqlite3_bind_text  (statementUpdate_, 1, [userInfo.Name UTF8String], -1, SQLITE_TRANSIENT);
	sqlite3_bind_text  (statementUpdate_, 2, [userInfo.ScreenName UTF8String], -1, SQLITE_TRANSIENT);
	sqlite3_bind_text  (statementUpdate_, 3, [userInfo.ProfileImageUrl UTF8String], -1, SQLITE_TRANSIENT);
	sqlite3_bind_double(statementUpdate_, 4, [userInfo.FollowersCount doubleValue]);
	sqlite3_bind_double(statementUpdate_, 5, [userInfo.FriendsCount doubleValue]);
	sqlite3_bind_text  (statementUpdate_, 6, [userInfo.text UTF8String], -1, SQLITE_TRANSIENT);
	sqlite3_bind_text  (statementUpdate_, 7, [userInfo.ID UTF8String], -1, SQLITE_TRANSIENT);
	int wasSucceeded = sqlite3_step(statementUpdate_);

	if( wasSucceeded != SQLITE_DONE ) {
		NSLog( @"Failed to update from database with '%s'.", sqlite3_errmsg( db_ ));
		return NO;
	}
	return YES;
}

-(BOOL)prepareSQL {
	NSString* insertSQL  = @"insert into userinfo values (?, ?, ?, ?, ?, ?, ?)";
	NSString* updateSQL  = @"update userinfo set name = ?, screen_name = ?, profile_image_url = ?, followers_count = ?, friends_count = ?, "
							"created_at = ?, text = ?, tweet_count = ? where id = ?";

	if(sqlite3_prepare_v2(db_, [insertSQL UTF8String], -1, &statementInsert_, NULL) == SQLITE_OK &&
	   sqlite3_prepare_v2(db_, [updateSQL UTF8String], -1, &statementUpdate_, NULL) == SQLITE_OK)
	{
		NSLog( @"Failed to prepare statement with '%s'.", sqlite3_errmsg( db_ ));
		return NO;
	}
	return YES;
}

-(void)finalizeSQL {
	if (db_) {
		// PREPARE済みSTATEMENTの廃棄
		sqlite3_finalize(statementInsert_);
		sqlite3_finalize(statementUpdate_);
	}
}