MENU

【swift アプリ開発】データべースを長年使わなかった理由? 

  • URLをコピーしました!
ios-appdevelopment-0015-02

こんにちは!Popoです。

こんな方へのお勧めの記事です。

  • 「UserDefaults」を使ってみたい方

前回、Sqliteを5年以上使用していなかったというお話をしました。

流石に、ある程度の量のデータをスマフォ側で保持する場面はありました。

そんな場合どうしていたのか?

今回はそんなお話をしてみたいと思います。

「Core Data」もあります。Appleがサポートしているというメリットはありますが、「UserDefaults」に比べて扱いが大変です。

目次

アプリの動作環境

アプリの動作環境

今回のアプリの動作環境です。

項目バージョン
XcodeVersion 14.3.1 (14E300c)
SwiftSwift version 5.8.1
MacOSmacOS Ventura バージョン13.4(22F66)

そこそこのデータ量の扱い方

そこそこのデータ量の扱い方

データベースを使うほどではないけど、ほどほどのデータ量を処理する場合、どのような対応を行ってきたかお話したいと思います。

考え方

「ある程度の量のデータ」をどのように保持していたか。

概要はこのような構成になります。

考え方
  • 「NSDictionary」を「NSMutableArray」の配列に登録する
  • 「NSMutableArray」を「UserDefaults」に登録する

この方法で、複数項目を配列で保持することが可能になります。

これを利用することで、「Sqlite」や「CoreData」等を使用せずに対応を行ってきました。

「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」に登録されたデータがログに表示されていますね

ログ

UserDefaultsのおさらい

UserDefaultsのおさらい

「UserDefaults」についておさらいをしましょう。

「UserDefaults」は登録されると、アプリ内のフォルダに下記のように「Plist」として作成されます。

「UserDefaults」ファイル

中身をXcodeで見てみると、上記で登録したキーの「ArrayData」が登録されています。

「UserDefaults」「ArrayData」中身

登録・更新

登録・更新はどの型でも「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」各項目の中身

取得

「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」の情報を取得ログ 

削除

削除はどの型でも「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」の中身

削除されました。

UserDefaultsに構造体も利用しましょう

UserDefaultsに構造体も利用しましょう

構造体も登録することができます。

下記の記事に詳しく記載されています。

まとめ

まとめ

前回記事の関連で「データべースを長年使わなかった理由?」についてお話をいたしました。

下記のような場合は、データベースを利用すべきだと思っています。

  • セキュリティを重視する
  • 大量データを永続的に利用する

そうでなければ、お手軽に「UserDefaults」でデータ操作したいですよね。

しかし、前回の記事でお話した通りSqliteもそこそこお手軽に使用できるようになりました。

「UserDefaults」をガッツリ使用するといった考えは、改めた方がよいと思いました。😓

今後は、データベースを積極的に使用していきたいと思っています。

それではまた!

よかったらシェアしてね!
  • URLをコピーしました!
目次