![ios-appdevelopment-0015-02](https://www.popoblog.tech/wp-content/uploads/2023/09/566468c960b095e9b73b170ffb46322e.jpg)
こんにちは!Popoです。
こんな方へのお勧めの記事です。
- 「UserDefaults」を使ってみたい方
前回、Sqliteを5年以上使用していなかったというお話をしました。
![](https://www.popoblog.tech/wp-content/uploads/2023/07/ios-appdevelopment-0014-01.jpg)
流石に、ある程度の量のデータをスマフォ側で保持する場面はありました。
そんな場合どうしていたのか?
今回はそんなお話をしてみたいと思います。
アプリの動作環境
![アプリの動作環境](https://www.popoblog.tech/wp-content/uploads/2023/09/1-4.png)
今回のアプリの動作環境です。
項目 | バージョン |
Xcode | Version 14.3.1 (14E300c) |
Swift | Swift version 5.8.1 |
MacOS | macOS Ventura バージョン13.4(22F66) |
そこそこのデータ量の扱い方
![そこそこのデータ量の扱い方](https://www.popoblog.tech/wp-content/uploads/2023/09/2-6.png)
データベースを使うほどではないけど、ほどほどのデータ量を処理する場合、どのような対応を行ってきたかお話したいと思います。
考え方
「ある程度の量のデータ」をどのように保持していたか。
概要はこのような構成になります。
![考え方](https://www.popoblog.tech/wp-content/uploads/2023/07/fb762c8f3243ef5dfd830fbbcef825c4.png)
- 「NSDictionary」を「NSMutableArray」の配列に登録する
- 「NSMutableArray」を「UserDefaults」に登録する
この方法で、複数項目を配列で保持することが可能になります。
これを利用することで、「Sqlite」や「CoreData」等を使用せずに対応を行ってきました。
![](https://www.popoblog.tech/wp-content/uploads/2023/05/cropped-79073d2d475c1194e5648b33dfb42d39.png)
「UserDefaults」は扱いが簡単ですからね!
アプリのロジック
- 「NSDictionary」を「NSMutableArray」の配列に登録する
「NSMutableDictionary」を「dataArray」( NSMutableArray)に設定して、「setArrayData」メソッドに引き継ぎます。
//配列定義
let dataArray : NSMutableArray! = NSMutableArray(capacity: 0)
for i in 1..<10 {
print("i: \(i)")
let dict = NSMutableDictionary()
dict.setValue("i: \(i)", forKey: "id")
dict.setValue("set Data" + "+" + "i: \(i)", forKey: "message")
dataArray.add(dict)
}
//UserDefaultsに保管
self.setArrayData(dataArray)
- 「NSMutableArray」を「UserDefaults」に登録する
下記の「setArrayData」メソッドです。
「NSMutableArray」は、そのまま「UserDefaults」に登録できないためData型に変換して登録しています。
fileprivate func setArrayData(_ arrayData:NSMutableArray) {
//UserDefaultsに保管
let userDefaults = UserDefaults.standard
let cacheArrayData = try! NSKeyedArchiver.archivedData(withRootObject: arrayData, requiringSecureCoding: false)
userDefaults.set(cacheArrayData, forKey: "ArrayData")
}
- 「UserDefaults」取得メソッド
「UserDefaults」から情報を取得するメソッドです。
fileprivate func getArrayData() -> NSMutableArray {
//UserDefaults
let userDefaults = UserDefaults.standard
var arrayData : NSMutableArray! = NSMutableArray(capacity: 0)
if ((userDefaults.object(forKey: "ArrayData")) != nil)
{
if let storedData = userDefaults.object(forKey: "ArrayData") as? Data
{
do{
if let unarchivedData = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSMutableArray.self, NSDictionary.self], from: storedData) as? NSMutableArray
{
arrayData = unarchivedData
}
}catch{
print("error in retriving data \(error.localizedDescription)")
}
}
}
return arrayData
}
中身の確認
「print」文で配列や「UserDefaults」の中身を見てみましょう。
override func viewDidLoad() {
super.viewDidLoad()
//配列定義
let dataArray : NSMutableArray! = NSMutableArray(capacity: 0)
// Do any additional setup after loading the view.
for i in 1..<10 {
print("i: \(i)")
let dict = NSMutableDictionary()
dict.setValue("i: \(i)", forKey: "id")
dict.setValue("set Data" + "+" + "i: \(i)", forKey: "message")
dataArray.add(dict)
}
//UserDefaultsに保管
self.setArrayData(dataArray)
//UserDefaultsからNSMutableArray取得
let getArrayData = self.getArrayData()
for data in getArrayData
{
let getID = (data as AnyObject).value(forKey: "id") as! String
let getMessageData = (data as AnyObject).value(forKey: "message") as! String
print("getID-----------------",getID)
print("getMessageData-----------------",getMessageData)
print("----------------------------")
}
}
「UserDefaults」に登録されたデータがログに表示されていますね
![ログ](https://www.popoblog.tech/wp-content/uploads/2023/07/c1e164bf6508985bab5e3dbcbf84f0f8.png)
![ログ](https://www.popoblog.tech/wp-content/uploads/2023/07/c1e164bf6508985bab5e3dbcbf84f0f8.png)
UserDefaultsのおさらい
![UserDefaultsのおさらい](https://www.popoblog.tech/wp-content/uploads/2023/09/3-6.png)
![UserDefaultsのおさらい](https://www.popoblog.tech/wp-content/uploads/2023/09/3-6.png)
「UserDefaults」についておさらいをしましょう。
「UserDefaults」は登録されると、アプリ内のフォルダに下記のように「Plist」として作成されます。
![「UserDefaults」ファイル](https://www.popoblog.tech/wp-content/uploads/2023/07/4d82efcdace9036fac2e0a9f17fbda19-1.png)
![「UserDefaults」ファイル](https://www.popoblog.tech/wp-content/uploads/2023/07/4d82efcdace9036fac2e0a9f17fbda19-1.png)
中身をXcodeで見てみると、上記で登録したキーの「ArrayData」が登録されています。
![「UserDefaults」「ArrayData」中身](https://www.popoblog.tech/wp-content/uploads/2023/07/9a026c56ee1217d5a693ca39ea4ce0ea.png)
![「UserDefaults」「ArrayData」中身](https://www.popoblog.tech/wp-content/uploads/2023/07/9a026c56ee1217d5a693ca39ea4ce0ea.png)
登録・更新
登録・更新はどの型でも「set」を使用します。
{キー}は必ず文字列で指定します。
UserDefaults.standard.set({値}, forKey: {キー})
let saveInt:Int = 1
let saveString:String = "001"
let saveBool:Bool = true
let saveFloat:Float = 2
let saveDouble:Double = 3
UserDefaults.standard.set(saveInt, forKey: "Int")
UserDefaults.standard.set(saveString, forKey: "String")
UserDefaults.standard.set(saveBool, forKey: "Bool")
UserDefaults.standard.set(saveFloat, forKey: "Float")
UserDefaults.standard.set(saveDouble, forKey: "Double")
中身を見てみると下記の通りです。
![「UserDefaults」各項目の中身](https://www.popoblog.tech/wp-content/uploads/2023/07/20230731-01.png)
![「UserDefaults」各項目の中身](https://www.popoblog.tech/wp-content/uploads/2023/07/20230731-01.png)
取得
「UserDefaults」の情報を取得するには、その値のデータ型に応じたメソッドを呼び出す必要があります。
UserDefaults.standard.object(forKey: {キー})
UserDefaults.standard.string(forKey: {キー})
UserDefaults.standard.array(forKey: {キー})
UserDefaults.standard.dictionary(forKey: {キー})
UserDefaults.standard.data(forKey: {キー})
UserDefaults.standard.stringArray(forKey: {キー})
UserDefaults.standard.integer(forKey: {キー})
UserDefaults.standard.float(forKey: {キー})
UserDefaults.standard.double(forKey: {キー})
UserDefaults.standard.bool(forKey: {キー})
UserDefaults.standard.url(forKey: {キー})
登録したデータを取得してみましょう!
let saveInt:Int = 1
let saveString:String = "001"
let saveBool:Bool = true
let saveFloat:Float = 2
let saveDouble:Double = 3
UserDefaults.standard.set(saveInt, forKey: "Int")
UserDefaults.standard.set(saveString, forKey: "String")
UserDefaults.standard.set(saveBool, forKey: "Bool")
UserDefaults.standard.set(saveFloat, forKey: "Float")
UserDefaults.standard.set(saveDouble, forKey: "Double")
let getInt:Int = UserDefaults.standard.integer(forKey: "Int")
let getString:String = UserDefaults.standard.string(forKey: "String") ?? ""
let getBool:Bool = UserDefaults.standard.bool(forKey: "Bool")
let getFloat:Float = UserDefaults.standard.float(forKey: "Float")
let getDouble:Double = UserDefaults.standard.double(forKey: "Double")
print("getInt-----------------",getInt)
print("getString-----------------",getString)
print("getBool-----------------",getBool)
print("getFloat-----------------",getFloat)
print("getDouble-----------------",getDouble)
![「UserDefaults」の情報を取得ログ](https://www.popoblog.tech/wp-content/uploads/2023/07/697797dd0d4f8510996c8cf37aa390b2.png)
![「UserDefaults」の情報を取得ログ](https://www.popoblog.tech/wp-content/uploads/2023/07/697797dd0d4f8510996c8cf37aa390b2.png)
削除
削除はどの型でも「removeObject」で削除を行います。
UserDefaults.standard.removeObject(forKey: {キー})
それでは、上記で登録したデータを削除してみましょう!
UserDefaults.standard.removeObject(forKey: "Int")
UserDefaults.standard.removeObject(forKey: "String")
UserDefaults.standard.removeObject(forKey: "Bool")
UserDefaults.standard.removeObject(forKey: "Float")
UserDefaults.standard.removeObject(forKey: "Double")
![削除後の「UserDefaults」の中身](https://www.popoblog.tech/wp-content/uploads/2023/07/4a60696fe99b66426eb7ce55b08fcfd1.png)
![削除後の「UserDefaults」の中身](https://www.popoblog.tech/wp-content/uploads/2023/07/4a60696fe99b66426eb7ce55b08fcfd1.png)
削除されました。
UserDefaultsに構造体も利用しましょう
![UserDefaultsに構造体も利用しましょう](https://www.popoblog.tech/wp-content/uploads/2023/09/4-5.png)
![UserDefaultsに構造体も利用しましょう](https://www.popoblog.tech/wp-content/uploads/2023/09/4-5.png)
構造体も登録することができます。
下記の記事に詳しく記載されています。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9VXNlckRlZmF1bHRzJUUzJTgxJUFFJUU2JUE2JTgyJUU4JUE2JTgxJUUzJTgxJUE4JUU2JTkzJThEJUU0JUJEJTlDJUU2JTk2JUI5JUU2JUIzJTk1JTI4U3dpZnQlMjkmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPWE4NjVlYzRjYmY3YWFlYmRmZTNiNTg4NTU3ZDNmYWNj&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDB1aG9vaSZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9ZTQ1ZTYwYTk4MGEyOTY4ZmY5MGY4ZWQzZGRkZWNlNDQ&blend-x=142&blend-y=486&blend-mode=normal&s=0bddf9baeb8910be8a6ff5c372bbcde3)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9VXNlckRlZmF1bHRzJUUzJTgxJUFFJUU2JUE2JTgyJUU4JUE2JTgxJUUzJTgxJUE4JUU2JTkzJThEJUU0JUJEJTlDJUU2JTk2JUI5JUU2JUIzJTk1JTI4U3dpZnQlMjkmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPWE4NjVlYzRjYmY3YWFlYmRmZTNiNTg4NTU3ZDNmYWNj&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDB1aG9vaSZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9ZTQ1ZTYwYTk4MGEyOTY4ZmY5MGY4ZWQzZGRkZWNlNDQ&blend-x=142&blend-y=486&blend-mode=normal&s=0bddf9baeb8910be8a6ff5c372bbcde3)
まとめ
![まとめ](https://www.popoblog.tech/wp-content/uploads/2023/09/5-5.png)
![まとめ](https://www.popoblog.tech/wp-content/uploads/2023/09/5-5.png)
前回記事の関連で「データべースを長年使わなかった理由?」についてお話をいたしました。
下記のような場合は、データベースを利用すべきだと思っています。
- セキュリティを重視する
- 大量データを永続的に利用する
![](https://www.popoblog.tech/wp-content/uploads/2023/05/cropped-79073d2d475c1194e5648b33dfb42d39.png)
![](https://www.popoblog.tech/wp-content/uploads/2023/05/cropped-79073d2d475c1194e5648b33dfb42d39.png)
![](https://www.popoblog.tech/wp-content/uploads/2023/05/cropped-79073d2d475c1194e5648b33dfb42d39.png)
そうでなければ、お手軽に「UserDefaults」でデータ操作したいですよね。
しかし、前回の記事でお話した通りSqliteもそこそこお手軽に使用できるようになりました。
「UserDefaults」をガッツリ使用するといった考えは、改めた方がよいと思いました。😓
今後は、データベースを積極的に使用していきたいと思っています。
![](https://www.popoblog.tech/wp-content/uploads/2023/05/cropped-79073d2d475c1194e5648b33dfb42d39.png)
![](https://www.popoblog.tech/wp-content/uploads/2023/05/cropped-79073d2d475c1194e5648b33dfb42d39.png)
![](https://www.popoblog.tech/wp-content/uploads/2023/05/cropped-79073d2d475c1194e5648b33dfb42d39.png)
それではまた!