Balbas Code

AWSのDynamoDBをSwiftで使う

公開日: 2024-10-23 09:16:35

本日はAWSのDynamoDBの使い方を記載していきます。
DynamoDBの特徴は何よりもNoSQLでリレーショナルにはあまり向いていないようです。
何よりAWSの中でも他のDBよりも安いです!!!
これだけで採用する理由となりました。

使うのはDynamoDBなのですが、アカウントを作るためにCognito、作成したアカウントの権限の設定でIAMを使用します。
aws_dynamoDB


Cognito
こちらではSwift (プログラム)で使用するアカウントを作成します。
aws_dynamoDB


IAM
こちらはCognitoで作成したアカウントに権限を付与します。
ロールから入っていき、編集の項目に赤枠のようなところがあるのでJSONに追記するような書き方をしていきます。
aws_dynamoDB


 


初期設定 SceneDelegate


import UIKit
import AWSCore

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

var window: UIWindow?

// シーンの初期化時にAWSの設定を行う
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
configureAWS() // AWSの設定を呼び出し

guard let _ = (scene as? UIWindowScene) else { return }
}

// AWSの設定関数を定義
func configureAWS() {
let credentialsProvider = AWSCognitoCredentialsProvider(
regionType: .USEast1, // 使用するリージョンを指定
identityPoolId: "YOUR_COGNITO_IDENTITY_POOL_ID" // CognitoのIdentity Pool ID
)
let configuration = AWSServiceConfiguration(
region: .USEast1, // 使用するリージョンを指定
credentialsProvider: credentialsProvider
)
AWSServiceManager.default().defaultServiceConfiguration = configuration
}

// 他のSceneDelegateメソッドもここに含める
}


modelクラス 今回はReceiptInfoクラス


import AWSDynamoDB

// モデルクラス: テーブル名とプライマリキーを定義
class ReceiptInfo: AWSDynamoDBObjectModel, AWSDynamoDBModeling {
// DynamoDBの項目に対応するプロパティを定義
@objc var UserID: String?
@objc var ReceiptID: String?
@objc var CreateDateTime: String?

// DynamoDBのテーブル名を返すメソッド
class func dynamoDBTableName() -> String {
return "ReceiptInfo"
}

// プライマリキーを指定するメソッド
class func hashKeyAttribute() -> String {
return "UserID"
}
}

 


データを登録する


// DynamoDBにデータを登録する関数
func putItem() {
// DynamoDBオブジェクトマッパーを取得
let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()

// 登録するデータを設定
let item = ReceiptInfo()
item.UserID = "exampleUserId"
item.ReceiptID = "exampleReceiptId"
item.CreateDateTime = "2024-10-23"

// ■データをDynamoDBに保存 save
dynamoDBObjectMapper.save(item).continueWith { task -> Any? in
if let error = task.error {
print("Error: \(error.localizedDescription)") // エラー処理
} else {
print("Item saved successfully!") // 保存成功
}
return nil
}
}

 


 


データの検索
指定したプライマリキーを使ってデータをDynamoDBから取得する方法です。


// DynamoDBからデータを取得する関数
func getItem() {
// DynamoDBオブジェクトマッパーを取得
let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()

// ■指定したプライマリキーを使ってデータを検索 load
dynamoDBObjectMapper.load(ReceiptInfo.self, hashKey: "exampleUserId", rangeKey: nil).continueWith { task -> Any? in
if let error = task.error {
print("Error: \(error.localizedDescription)") // エラー処理
} else if let item = task.result as? ReceiptInfo {
// データ取得成功時の処理
print("Item retrieved: \(item.ReceiptID ?? "No receipt")")
} else {
print("Item not found.") // データが見つからなかった場合
}
return nil
}
}



データの削除
指定したデータを削除する。


// DynamoDBからデータを削除する関数
func deleteItem() {
// DynamoDBオブジェクトマッパーを取得
let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()

// 削除対象のデータを指定
let item = ReceiptInfo()
item.UserID = "exampleUserId"

// ■データをDynamoDBから削除 remove
dynamoDBObjectMapper.remove(item).continueWith { task -> Any? in
if let error = task.error {
print("Error: \(error.localizedDescription)") // エラー処理
} else {
print("Item deleted successfully!") // 削除成功
}
return nil
}
}



データの更新
データの更新も登録と同じくsaveメソッドを使います。


// DynamoDBのデータを更新する関数
func updateItem() {
// DynamoDBオブジェクトマッパーを取得
let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()

// まずデータを取得してから更新
dynamoDBObjectMapper.load(ReceiptInfo.self, hashKey: "exampleUserId", rangeKey: nil).continueWith { task -> Any? in
if let error = task.error {
print("Error: \(error.localizedDescription)") // エラー処理
} else if let item = task.result as? ReceiptInfo {
// 取得したデータを更新
item.ReceiptID = "updatedReceiptId"
item.CreateDateTime = "2024-10-24"

// ■更新データを保存
dynamoDBObjectMapper.save(item).continueWith { saveTask -> Any? in
if let saveError = saveTask.error {
print("Save Error: \(saveError.localizedDescription)") // エラー処理
} else {
print("Item updated successfully!") // 更新成功
}
return nil
}
}
return nil
}
}

 


なおDynamoDBはスキーマレス(列の定義がない)DBのため、テーブル内に存在する列情報であれば同じ列に値を追加するが、列がないデータであればどんどん列を新たに追加していってしまう。
なのでテーブル名だけ作成して、プログラム側と一致させれば簡単に登録できます。

登録したデータに列を新たに追加したい場合は、新たにデータを登録し直すか、一度エクスポートして追加したい列データを編集→インポートするしかないようです。


aws_dynamoDB