स्विफ्ट ऐप में स्थानीय डेटा कैसे बचाएं?


148

मैं वर्तमान में स्विफ्ट में विकसित एक iOS ऐप पर काम कर रहा हूं और मुझे डिवाइस पर कुछ उपयोगकर्ता-निर्मित सामग्री संग्रहीत करने की आवश्यकता है, लेकिन मैं डिवाइस पर उपयोगकर्ताओं की सामग्री को संग्रहीत / प्राप्त करने का एक सरल और त्वरित तरीका नहीं ढूंढ सकता हूं।

क्या कोई समझा सकता है कि स्थानीय भंडारण को कैसे स्टोर और एक्सेस किया जाए?

जब उपयोगकर्ता किसी क्रिया को निष्पादित करता है और एप्लिकेशन प्रारंभ होने पर उसे प्राप्त करता है, तो डेटा को संग्रहीत करना है।


अरे और आपका स्वागत है, आप किस तरह का डेटा स्टोर कर रहे हैं? क्या आप कोई भी कोड प्रदान कर सकते हैं जो आप देख रहे हैं उसका एक उदाहरण दें? धन्यवाद।
वीजेड

1
डेटा है कि मैं स्टोर करने की जरूरत है मूल रूप से सिर्फ स्ट्रिंग डेटा है। इसलिए इसे वास्तव में सरल रखने के लिए, मुझे दो स्ट्रिंग मानों को सहेजने की आवश्यकता है जो मुझे प्राप्त हो सकते हैं यदि उपयोगकर्ता ऐप को पुनरारंभ करता है।
निकलैस रिड्यूइंग

2
आप NSUserDefaults का उपयोग कर सकते हैं। यहाँ आपको कोडिंगएक्सप्लेयर की
ususerdefaults-

जवाबों:


197

सबसे सरल समाधान यदि आप केवल दो तार जमा कर रहे हैं NSUserDefaults, तो स्विफ्ट 3 में इस वर्ग को केवल नाम दिया गया है UserDefaults

अपनी कुंजियों को विश्व स्तर पर संग्रहीत करना सबसे अच्छा है ताकि आप उन्हें अपने कोड में कहीं और पुनः उपयोग कर सकें।

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

स्विफ्ट 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
}

मामूली विन्यास, झंडे या आधार तार से अधिक गंभीर कुछ के लिए आपको किसी प्रकार के लगातार स्टोर का उपयोग करना चाहिए - इस समय एक लोकप्रिय विकल्प दायरे है, लेकिन आप SQLite या Apple का उपयोग स्वयं CoreData के लिए भी कर सकते हैं ।


7
अच्छा उदाहरण है। यह संभवतः एक संरचना के बजाय एक एनम होना चाहिए।
पैन और स्कैन

3
Enum का एक अजीब कार्यान्वयन, यदि आपके पास सिर्फ स्थैतिक स्थिरांक हैं, तो यह एक संरचना भी हो सकती है।
क्रेग ग्रुमिट

1
यह कोड गलत है। setValue(_:forKey:)UserDefaults को डेटा बचाने के लिए KVC विधियों का उपयोग न करें । प्रदान की UserDefaultsविधियों set(_:forKey:)(स्विफ्ट 3 में) का उपयोग करें।
rammdy

मैंने स्विफ्ट 3 कोड को अपडेट किया। मुझे नहीं पता कि स्विफ्ट 2 सिंटैक्स क्या होना चाहिए।
28:17

@rmaddy जैसा है ठीक है।
वीज़

57

वे कहते हैं कि NSUserDefaults का उपयोग करें

जब मैं पहली बार लंबी अवधि (ऐप क्लोज के बाद) डेटा स्टोरेज को लागू कर रहा था, तो मैंने जो कुछ भी ऑनलाइन पढ़ा, उसने मुझे NSUserDefaults की ओर इशारा किया। हालांकि, मैं एक शब्दकोश को स्टोर करना चाहता था और, हालांकि, यह संभव है, यह एक दर्द साबित हो रहा था। मैंने घंटों की कोशिश की कि मैं टाइप-एरर पाने की कोशिश करूं।

NSUserDefaults फंक्शन में लिमिटेड भी है

आगे पढ़ने से पता चला कि NSUserDefaults का रीड / राइट वास्तव में एक ही बार में सब कुछ या कुछ भी नहीं पढ़ने / लिखने के लिए ऐप को मजबूर करता है, इसलिए यह कुशल नहीं है। तब मुझे पता चला कि एक सरणी को पुनः प्राप्त करना सीधे आगे नहीं है। मुझे एहसास हुआ कि यदि आप कुछ तार या बूलियन से अधिक भंडारण कर रहे हैं, तो NSUserDefaults वास्तव में आदर्श नहीं है।

यह भी स्केलेबल नहीं है। यदि आप कोड बनाना सीख रहे हैं, तो स्केलेबल तरीका सीखें। वरीयताओं से संबंधित सरल तार या बूलियन के भंडारण के लिए केवल NSUserDefaults का उपयोग करें। कोर डेटा का उपयोग करके सरणियों और अन्य डेटा को स्टोर करें, यह उतना कठिन नहीं है जितना वे कहते हैं। बस छोटे से शुरू करो।

अद्यतन: इसके अलावा, यदि आप Apple वॉच समर्थन जोड़ते हैं, तो एक और संभावित विचार है। आपके ऐप का NSUserDefaults अब स्वचालित रूप से वॉच एक्सटेंशन में भेज दिया गया है।

कोर डेटा का उपयोग करना

इसलिए मैंने कोर डेटा के बारे में चेतावनी को नजरअंदाज कर दिया और अधिक कठिन समाधान और पढ़ना शुरू कर दिया। तीन घंटे के भीतर मेरे पास यह काम कर रहा था। मेरे पास मेरा टेबल एरे को कोर डेटा में सहेजा जा रहा था और ऐप को वापस खोलने पर डेटा को फिर से लोड किया जा रहा था! ट्यूटोरियल कोड को अनुकूलित करना काफी आसान था और मैं इसे थोड़े अतिरिक्त प्रयोग के साथ शीर्षक और विस्तार सरणियों दोनों को स्टोर करने में सक्षम था।

तो इस पोस्ट को पढ़ने वाले किसी व्यक्ति के लिए जो NSUserDefault प्रकार के मुद्दों से जूझ रहा है या जिसकी आवश्यकता स्ट्रिंग संचय से अधिक है, कोर डेटा के साथ एक या दो घंटे खेलने पर विचार करें।

यहाँ ट्यूटोरियल मैं पढ़ा हूँ:

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

यदि आपने "कोर डेटा" की जांच नहीं की है

यदि आपने अपना ऐप बनाते समय "कोर डेटा" की जांच नहीं की है, तो आप इसे बाद में जोड़ सकते हैं और इसमें केवल पाँच मिनट लगते हैं:

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 से डेटा हटाएं


6
आपके डेटा को किसी .plist फ़ाइल में कहीं दस्तावेज़ दस्तावेज़ निर्देशिका में या कहीं और ऐप के सैंडबॉक्स की गई निर्देशिका में सहेजने का मध्य आधार है।
निकोलस मियारी

मैं नौसिखिया हूं, इसलिए नमक के दाने के साथ यह सवाल उठाएं, लेकिन क्या वह बीच का मैदान है? NSUserDefaults व्यावहारिक रूप से एक p.list फ़ाइल वैसे भी है, इसलिए (जो मैंने पढ़ा है उस पर आधारित) दस्तावेज़ निर्देशिका में p.list फ़ाइल में सहेजना NSUserDefaults का उपयोग करने के समान है। जिस कारण से मैंने उस पद्धति का उपयोग नहीं किया, वह यह था कि किसी सरणी को p.list में सहेजने से ऐसा लगता था कि इसमें अतिरिक्त चरण शामिल हैं, जैसे कि इसे किसी अन्य प्रकार में परिवर्तित करना और फिर बाद में, जब मान पुनर्स्थापित करते हैं, तो उन्हें पढ़ने के बाद मान पुन: असाइन करने की आवश्यकता होती है पी। लिस्ट से। फिर से, पिछले कुछ दिनों में पूरी तरह से मेरे पढ़ने पर आधारित।
डेव जी

अच्छी तरह से, .plist फ़ाइल के लिए एक सरणी को सहेजना बहुत सरल है (पदानुक्रम में सभी ऑब्जेक्ट Arrays, Strings,
D शब्दकोशों

सहमत, फ़ाइल पढ़ना सभी-या-कुछ नहीं है, लेकिन आप इसकी संरचना के आधार पर अपने डेटा को अलग-अलग फ़ाइलों में विभाजित कर सकते हैं। और कोरडाटा में एक महत्वपूर्ण सीखने की अवस्था थी, कम से कम आखिरी बार जब मैंने जाँच की थी।
निकोलस मिआरी

3
मैं कहूंगा: प्राथमिकताओं को संग्रहीत करने के लिए NSUserDefaults का उपयोग करें (यही नाम का अर्थ है सब के बाद), लगातार और / या संवेदनशील डेटा संग्रहीत करने के लिए चाबी का गुच्छा, बहुत मूल ऐप जनरेट किए गए डेटा के लिए .plist फ़ाइलों की कस्टम योजना , और अधिक भारी सामान के लिए Coreataata। ।
निकोलस मियारी

11

Okey तो @bploat और के लिंक के लिए धन्यवाद http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/

मैंने पाया है कि कुछ बुनियादी स्ट्रिंग स्टोरेज के लिए उत्तर काफी सरल है।

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/


9

NSCoding और NSKeyedArchiver का उपयोग करना डेटा के लिए एक और बढ़िया विकल्प है जो बहुत जटिल है NSUserDefaults, लेकिन जिसके लिए CoreData ओवरकिल होगा। यह आपको फ़ाइल संरचना को अधिक स्पष्ट रूप से प्रबंधित करने का अवसर भी देता है, जो कि अगर आप एन्क्रिप्शन का उपयोग करना चाहते हैं तो बहुत अच्छा है।


7

स्विफ्ट 4.0 के लिए, यह आसान हो गया:

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

6

स्विफ्ट 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 }

2
आपको UserDefaults में Corttoken की तरह smth को सेव नहीं करना चाहिए..कृपया इसके लिए किचेन का इस्तेमाल करें
BilalReffas

5

स्विफ्ट 3 के लिए

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

डेटा को बचाने के लिए KVC विधियों का उपयोग न करें।
रामादि

4

जो लोग कुछ कारणों से UserDefaults को संभालना पसंद नहीं करेंगे, उनके लिए एक और विकल्प है - 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

स्विफ्ट 5+

कोई भी जवाब वास्तव में स्थानीय भंडारण क्षमताओं में निर्मित डिफ़ॉल्ट को विस्तार से कवर नहीं करता है। यह सिर्फ तार से कहीं अधिक कर सकता है

आपके पास डिफॉल्ट से डेटा प्राप्त करने के लिए ऐप्पल डॉक्यूमेंटेशन से सीधे निम्नलिखित विकल्प हैं।

func object(forKey: String) -> Any?
//Returns the object associated with the specified key.

func url(forKey: String) -> URL?
//Returns the URL associated with the specified key.

func array(forKey: String) -> [Any]?
//Returns the array associated with the specified key.

func dictionary(forKey: String) -> [String : Any]?
//Returns the dictionary object associated with the specified key.

func string(forKey: String) -> String?
//Returns the string associated with the specified key.

func stringArray(forKey: String) -> [String]?
//Returns the array of strings associated with the specified key.

func data(forKey: String) -> Data?
//Returns the data object associated with the specified key.

func bool(forKey: String) -> Bool
//Returns the Boolean value associated with the specified key.

func integer(forKey: String) -> Int
//Returns the integer value associated with the specified key.

func float(forKey: String) -> Float
//Returns the float value associated with the specified key.

func double(forKey: String) -> Double
//Returns the double value associated with the specified key.

func dictionaryRepresentation() -> [String : Any]
//Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.

यहाँ 'सेटिंग' के लिए विकल्प हैं

func set(Any?, forKey: String)
//Sets the value of the specified default key.

func set(Float, forKey: String)
//Sets the value of the specified default key to the specified float value.

func set(Double, forKey: String)
//Sets the value of the specified default key to the double value.

func set(Int, forKey: String)
//Sets the value of the specified default key to the specified integer value.

func set(Bool, forKey: String)
//Sets the value of the specified default key to the specified Boolean value.

func set(URL?, forKey: String)
//Sets the value of the specified default key to the specified URL.

यदि प्राथमिकताएं जैसी चीजें संग्रहीत की जा रही हैं और एक बड़ा डेटा सेट नहीं है तो ये पूरी तरह से ठीक विकल्प हैं।

दोहरा उदाहरण :

स्थापना:

let defaults = UserDefaults.standard
var someDouble:Double = 0.5
defaults.set(someDouble, forKey: "someDouble")

मिल रहा:

let defaults = UserDefaults.standard
var someDouble:Double = 0.0
someDouble = defaults.double(forKey: "someDouble")

एक प्राप्तकर्ता के बारे में क्या दिलचस्प है शब्दकोश रिप्रजेंटेशन , यह आसान गेट्टर आपके सभी डेटा प्रकारों की परवाह किए बिना होगा जो वे हैं और उन्हें एक अच्छे शब्दकोश में डालते हैं जिसे आप स्ट्रिंग नाम से एक्सेस कर सकते हैं और जब आप पूछते हैं तो सही संगत डेटा प्रकार दे सकते हैं। चूंकि यह 'किसी भी' प्रकार का है

आप अपने स्वयं के वर्ग और वस्तुओं को स्टोर कर सकते हैं और तदनुसार func set(Any?, forKey: String)और func object(forKey: String) -> Any?सेटर और गेट्टर का उपयोग कर सकते हैं ।

आशा है कि यह स्थानीय डेटा संग्रहीत करने के लिए UserDefaults वर्ग की अधिक शक्ति को स्पष्ट करता है।

आपको कितना और कितना स्टोर करना चाहिए, इस नोट पर, हार्डी_गर्मनी ने इस पोस्ट पर एक अच्छा जवाब दिया , यहां से एक उद्धरण दिया गया है

जैसा कि पहले ही उल्लेख किया गया है: मैं किसी भी SIZE सीमा (भौतिक मेमोरी को छोड़कर) में एक .plist (जैसे UserDefaults) में डेटा संग्रहीत करने के बारे में नहीं जानता। तो यह HOW MUCH का सवाल नहीं है।

असली सवाल यह होना चाहिए कि आप नए / परिवर्तित मूल्य कैसे लिखते हैं ... और यह बैटरी नाली से संबंधित है जो यह लिखता है।

आईओएस के पास "डिस्क" के लिए एक भौतिक लिखने से बचने का कोई मौका नहीं है अगर एक भी मूल्य बदल गया है, बस डेटा अखंडता रखने के लिए। UserDefaults के संबंध में यह पूरी फाइल डिस्क पर फिर से लिखा गया है।

यह "डिस्क" को शक्ति देता है और इसे लंबे समय तक संचालित रखता है और आईओएस को कम बिजली की स्थिति में जाने से रोकता है।

इस पोस्ट से उपयोगकर्ता मोहम्मद रज़ा फ़रहानी द्वारा बताई गई कुछ अन्य बातों पर ध्यान दें, जो कि यूजरडिफॉल्ट्स की अतुल्यकालिक और तुल्यकालिक प्रकृति है।

जब आप एक डिफ़ॉल्ट मान सेट करते हैं, तो यह आपकी प्रक्रिया के भीतर, और अतुल्यकालिक रूप से लगातार भंडारण और अन्य प्रक्रियाओं में बदल जाता है।

उदाहरण के लिए यदि आप प्रोग्राम को सहेजते हैं और जल्दी से बंद करते हैं तो आप देख सकते हैं कि यह परिणाम नहीं बचाता है, ऐसा इसलिए है क्योंकि यह अतुल्यकालिक रूप से जारी है। आप इसे हर समय नोटिस नहीं कर सकते हैं, इसलिए यदि आप प्रोग्राम को छोड़ने से पहले बचत करने की योजना बनाते हैं, तो आप इसे समाप्त करने के लिए कुछ समय देकर इसके लिए जिम्मेदार हो सकते हैं।

हो सकता है कि किसी के पास इसके कुछ अच्छे समाधान हों जो वे टिप्पणियों में साझा कर सकें?


0

NsUserDefaults केवल छोटे चर आकार बचाता है। यदि आप कई वस्तुओं को सहेजना चाहते हैं तो आप कोरडेटा को एक देशी समाधान के रूप में उपयोग कर सकते हैं, या मैंने एक पुस्तकालय बनाया है जो आपको .save () फ़ंक्शन के रूप में आसान रूप में बचाने में मदद करता है। यह SQLite पर आधारित है।

SundeedQLite

इसे देखें और मुझे अपनी टिप्पणी बताएं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.