web-dev-qa-db-ja.com

Swiftアプリでローカルデータを保存する方法

私は現在Swiftで開発されたiOSアプリを開発中です。ユーザーが作成したコンテンツをデバイスに保存する必要がありますが、ユーザーのコンテンツをデバイスに保存/受信する簡単で素早い方法は見つかりません。

誰かがローカルストレージを保存しアクセスする方法を説明できますか?

アイデアは、ユーザーがアクションを実行したときにデータを保存し、アプリの起動時にそれを受け取ることです。

127

2つの文字列を格納するだけの場合の最も簡単な解決策はNSUserDefaultsです。Swift3では、このクラスの名前はUserDefaultsに変更されました。

キーをコード内の別の場所で再利用できるように、キーをグローバルのどこかに格納することをお勧めします。

struct defaultsKeys {
    static let keyOne = "firstStringKey"
    static let keyTwo = "secondStringKey"
}

Swift 3.0、4.0、および5.0

// Setting

let defaults = UserDefaults.standard
defaults.set("Some String Value", forKey: defaultsKeys.keyOne)
defaults.set("Another String Value", forKey: defaultsKeys.keyTwo)

// Getting

let defaults = UserDefaults.standard
if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) {
    print(stringOne) // Some String Value
}
if let stringTwo = defaults.string(forKey: defaultsKeys.keyTwo) {
    print(stringTwo) // Another String Value
}

スウィフト2.0

// Setting

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("Some String Value", forKey: defaultsKeys.keyOne)
defaults.setObject("Another String Value", forKey: defaultsKeys.keyTwo)

// Getting

let defaults = NSUserDefaults.standardUserDefaults()
if let stringOne = defaults.stringForKey(defaultsKeys.keyOne) {
    print(stringOne) // Some String Value
}
if let stringTwo = defaults.stringForKey(defaultsKeys.keyTwo) {
    print(stringTwo) // Another String Value
}

マイナーな設定、フラグ、またはベース文字列よりも深刻なものについては、ある種の永続ストアを使用するべきです - 現時点で人気のあるオプションは Realm ですが、 SQLiteも使用できます。 またはりんごは非常に独自の CoreData を持っています。

177
Wez

彼らはNSUserDefaultsを使うと言う

長期間(アプリ終了後)のデータストレージを初めて実装したとき、私がオンラインで読んだすべてのことがNSUserDefaultsに向けられていました。しかし、私は辞書を保存したいと思いました、そして、可能であるけれども、それは苦痛であることを証明していました。私はタイプエラーを解決するために何時間も費やしました。

NSUserDefaultsは機能も制限されています

さらに読むと、NSUserDefaultsの読み書きによって、アプリがすべてを読み書きすることを強制する方法が明らかになったため、効率的ではありません。それから私は配列を取得することは簡単ではないことを学びました。もしあなたが数個以上の文字列やブール値を格納しているのであれば、NSUserDefaultsは実際には理想的ではないことに気づきました。

拡張性もありません。コーディング方法を学んでいるのであれば、スケーラブルな方法を学んでください。設定に関連する単純な文字列またはブール値を格納するためにのみNSUserDefaultsを使用してください。 Core Dataを使って配列や他のデータを保存する、それは彼らが言うほど難しくありません。小さく始めてください。

アップデート:また、あなたがApple Watchサポートを追加するならば、もう一つの潜在的な考慮事項がある。アプリのNSUserDefaultsが自動的にWatch Extensionに送信されます。

コアデータの使用

そこで私は、Core Dataがもっと難しい解決策であるという警告を無視して読み始めました。 3時間以内に私はそれを働かせました。テーブル配列をCore Dataに保存し、アプリを開いたときにデータを再読み込みしました。チュートリアルのコードは適応するのに十分に簡単で、タイトルと詳細の両方の配列を少し追加するだけで保存することができました。

したがって、NSUserDefaultタイプの問題に苦しんでいる、または文字列を格納する以上のものが必要なこの記事を読む人は、コアデータを使って1〜2時間遊ぶことを検討してください。

これが私が読んだチュートリアルです。

http://www.raywenderlich.com/85578/first-core-data-app-using-Swift

「コアデータ」をチェックしなかった場合

アプリを作成したときに[Core Data]をチェックしなかった場合は、あとで追加できますが、5分で完了します。

http://craig24.com/2014/12/how-to-add-core-data-to-an-existing-Swift-project-in-xcode/

http://blog.zeityer.com/post/119012600864/adding-core-data-to-an-existing-Swift-project

コアデータリストから削除する方法

Coredata Swiftからデータを削除します

49
Dave G

オーケーそれでは @ bploatへのリンクhttp://www.codingexplorer.com/nsuserdefaults-a - はじめに/

私は、答えがいくつかの基本的な文字列ストレージにとって非常に単純であることを発見しました。

let defaults = NSUserDefaults.standardUserDefaults()

// Store
defaults.setObject("theGreatestName", forKey: "username")

// Receive
if let name = defaults.stringForKey("username")
{
    print(name)
    // Will output "theGreatestName"
}

私はここでそれを要約した http://ridewing.se/blog/save-local-data-in-Swift/

11

NSCodingとNSKeyedArchiver を使用することは、NSUserDefaultsには複雑すぎるデータのもう1つの優れた選択肢ですが、CoreDataはやり過ぎです。また、ファイル構造をより明示的に管理する機会も与えられます。暗号化を使用したい場合にはこれは素晴らしいことです。

8
Patrick Lynch

Swift 4.0では、これが簡単になりました。

let defaults = UserDefaults.standard
//Set
defaults.set(passwordTextField.text, forKey: "Password")
//Get
let myPassword = defaults.string(forKey: "Password")

Swift 3.0

セッター:ローカルストレージ

let authtoken = "12345"
    // Userdefaults helps to store session data locally 
 let defaults = UserDefaults.standard                                           
defaults.set(authtoken, forKey: "authtoken")

 defaults.synchronize()

ゲッター:ローカルストレージ

 if UserDefaults.standard.string(forKey: "authtoken") != nil {

//perform your task on success }
5

スイフト3用

UserDefaults.standard.setValue(token, forKey: "user_auth_token")
print("\(UserDefaults.standard.value(forKey: "user_auth_token")!)")
5
Arun Yokesh

何らかの理由でUserDefaultを処理したくないという人には、NSKeyedArchiverとNSKeyedUnarchiverという別の選択肢があります。アーカイバを使用してオブジェクトをファイルに保存したり、アーカイブファイルを元のオブジェクトにロードしたりするのに役立ちます。

// To archive object,
let mutableData: NSMutableData = NSMutableData()
let archiver: NSKeyedArchiver = NSKeyedArchiver(forWritingWith: mutableData)
archiver.encode(object, forKey: key)
archiver.finishEncoding()
return mutableData.write(toFile: path, atomically: true)

// To unarchive objects,
if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) {
    let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
    let object = unarchiver.decodeObject(forKey: key)
}

上記のサンプルコードを使用して、オブジェクトをローカルストレージに保存/ロードするための簡単なユーティリティを作成しました。あなたはこれを見たいと思うかもしれません。 https://github.com/DragonCherry/LocalStorage

4
DragonCherry