একটি সুইফট অ্যাপে স্থানীয় ডেটা কীভাবে সংরক্ষণ করবেন?


148

আমি বর্তমানে সুইফটে উন্নত একটি আইওএস অ্যাপে কাজ করছি এবং আমার ডিভাইসে কিছু ব্যবহারকারী-তৈরি সামগ্রী সংরক্ষণ করতে হবে তবে আমি ডিভাইসে ব্যবহারকারীদের সামগ্রী সংরক্ষণ / গ্রহণ করার সহজ এবং দ্রুত উপায় খুঁজে পাচ্ছি না।

কেউ কীভাবে স্থানীয় স্টোরেজ সংরক্ষণ এবং অ্যাক্সেস করবেন তা ব্যাখ্যা করতে পারেন?

ধারণাটি হ'ল ব্যবহারকারী যখন কোনও ক্রিয়া সম্পাদন করে এবং অ্যাপ্লিকেশন শুরু হয় তখন তা গ্রহণ করে।


আরে এবং স্বাগতম, আপনি কোন ধরণের ডেটা সঞ্চয় করছেন? আপনি যা খুঁজছেন তার উদাহরণ দেওয়ার জন্য আপনি কোনও কোড সরবরাহ করতে পারেন? ধন্যবাদ।
ওয়েজ

1
আমার যে ডেটা সংরক্ষণ করতে হবে তা হ'ল মূলত কেবল স্ট্রিং ডেটা। সুতরাং এটি সত্যিই সহজ রাখতে, আমার দুটি স্ট্রিং মানগুলি সংরক্ষণ করতে হবে যা আমি অ্যাপ্লিকেশনটি পুনরায় চালু করতে পারলে আমি পেতে পারি।
নিক্লাস রাইডিংয়ে

2
আপনি এনএসউসারডেফল্টস ব্যবহার করতে পারেন। আপনার কোডিনজেক্সপ্লোরার
a-

উত্তর:


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
}

সুইফট ২.০

// 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 বা আপেল খুব নিজের CoreData


7
চমৎকার উদাহরণ। এটি সম্ভবত কাঠামোর পরিবর্তে একটি এনাম হওয়া উচিত।
প্যান এবং স্ক্যান

3
এনামের একটি অদ্ভুত বাস্তবায়ন চালিয়ে যায়, যদি আপনার কেবল স্ট্যাটিক ধ্রুবক থাকে তবে এটি স্ট্রাক্টও হতে পারে।
ক্রেগ গ্রুমিট

1
এই কোডটি ভুল। setValue(_:forKey:)ইউজারডিফল্টগুলিতে ডেটা সংরক্ষণ করতে কেভিসি পদ্ধতি ব্যবহার করবেন না । সরবরাহিত UserDefaultsপদ্ধতিগুলি set(_:forKey:)(সুইফ্ট 3 তে) ব্যবহার করুন।
rmaddy

আমি সুইফট 3 কোড আপডেট করেছি। সুইফট 2 সিনট্যাক্সটি কী হওয়া উচিত তা আমি জানি না।
rmaddy

@ আরমড্ডি ঠিক আছে ঠিক আছে।
ওয়েজ

57

তারা বলে NSUserDephaults ব্যবহার করুন

আমি যখন প্রথমবারের জন্য দীর্ঘমেয়াদী (অ্যাপ্লিকেশন বন্ধ হওয়ার পরে) ডেটা স্টোরেজ বাস্তবায়ন করছিলাম তখন আমি অনলাইনে যা কিছু পড়ি তা আমাকে এনএসউসারডেফল্টসের দিকে নির্দেশ করে। যাইহোক, আমি একটি অভিধান সঞ্চয় করতে চেয়েছিলাম এবং যদিও এটি সম্ভব, এটি একটি ব্যথা হিসাবে প্রমাণিত হয়েছিল। আমি টাইপ-ত্রুটিগুলি সরিয়ে যাওয়ার চেষ্টা করে ঘন্টা ব্যয় করেছি।

এনএসউসারডেফাল্টস ফাংশনেও সীমিত

আরও পড়ার ফলে NSUserDephaults এর পঠন / লিখনটি কীভাবে সত্যিই অ্যাপ্লিকেশনটিকে সমস্ত কিছু বা কিছুই লিখতে বাধ্য করে তা একসাথে, তাই এটি কার্যকর নয়। তারপরে আমি শিখেছি যে অ্যারে পুনরুদ্ধার করা সরাসরি এগিয়ে নেই। আমি বুঝতে পেরেছি যে আপনি যদি কয়েকটি স্ট্রিং বা বুলিয়ানগুলির বেশি সঞ্চয় করেন তবে এনএসউসারডেফল্টস সত্যিই আদর্শ নয়।

এটিও স্কেলযোগ্য নয়। আপনি যদি কোডিং শিখেন তবে স্কেলেবল উপায় শিখুন। পছন্দগুলি সম্পর্কিত সাধারণ স্ট্রিং বা বুলিয়ান সংরক্ষণ করার জন্য কেবল এনএসউসারডেফল্টগুলি ব্যবহার করুন। কোর ডেটা ব্যবহার করে অ্যারে এবং অন্যান্য ডেটা সঞ্চয় করুন, তারা যা বলছেন ততটা কঠিন নয়। শুধু ছোট শুরু।

আপডেট: এছাড়াও, আপনি যদি অ্যাপল ওয়াচ সমর্থন যুক্ত করেন তবে আরও একটি সম্ভাব্য বিবেচনা রয়েছে। আপনার অ্যাপ্লিকেশনটির NSUserDephaults এখন স্বয়ংক্রিয়ভাবে ওয়াচ এক্সটেনশনে প্রেরণ করা হবে।

কোর ডেটা ব্যবহার করা হচ্ছে

তাই আমি কোর ডেটা আরও কঠিন সমাধান হবার বিষয়ে সতর্কতাগুলি উপেক্ষা করে পড়া শুরু করেছি। তিন ঘন্টার মধ্যে আমার এটি কাজ হয়ে গেল। আমি আমার টেবিল অ্যারেটি কোর ডেটাতে সংরক্ষণ করা এবং অ্যাপ্লিকেশনটি ব্যাক আপ করার পরে ডেটা পুনরায় লোড করছিলাম! টিউটোরিয়াল কোডটি মানিয়ে নেওয়ার পক্ষে যথেষ্ট সহজ ছিল এবং আমি এটি কেবলমাত্র কিছু অতিরিক্ত পরীক্ষামূলকভাবে শিরোনাম এবং বিশদ অ্যারে উভয়ই সঞ্চয় করতে সক্ষম হয়েছি।

সুতরাং যে কেউ এই পোস্টটি পড়ছেন তাদের জন্য যিনি এনএসইউসারডেফল্ট টাইপ সমস্যাগুলির সাথে লড়াই করছেন বা যার স্ট্রিংগুলি সংরক্ষণ করার চেয়ে বেশি প্রয়োজন, মূল ডেটা দিয়ে এক ঘন্টা বা দুই ঘন্টা ব্যয় করার বিষয়টি বিবেচনা করুন।

আমি যে টিউটোরিয়ালটি পড়েছি তা এখানে:

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

কোর ডেটা তালিকা থেকে কীভাবে মুছবেন

কোরেডাটা সুইফ্ট থেকে ডেটা মুছুন


6
আপনার ডেটা ডকুমেন্টস ডিরেক্টরিতে বা অ্যাপের স্যান্ডবক্সযুক্ত ডিরেক্টরিতে অন্য কোথাও একটি .plist ফাইলে সংরক্ষণ করার মাঝখানে ভিত্তি রয়েছে।
নিকোলাস মিয়ারি

আমি একজন নবজাতক, সুতরাং লননের দানা দিয়ে এই প্রশ্নটি নিয়ে যান, তবে এটি কি মাঝের জায়গা? এনএসইউসারডেফাল্টগুলি কার্যতঃ যাইহোক একটি পি.লিস্ট ফাইল, সুতরাং (আমি যা পড়েছি তার উপর ভিত্তি করে) ডকুমেন্ট ডিরেক্টরিতে একটি পি.লাইস্ট ফাইলটিতে সংরক্ষণ করা এনএসইউসারডেফাল্টস ব্যবহারের মতোই। আমি এই পদ্ধতিটি ব্যবহার না করার কারণটি হ'ল একটি পি.লিস্টে অ্যারের সংরক্ষণ করা অতিরিক্ত শৃঙ্খলার মতো এটির মতো অন্য ধরণের রূপান্তরিত করার মতো শোনানো এবং পরে যখন মানগুলি পুনরুদ্ধার করার জন্য প্রয়োজন তখন সেগুলি পড়ার পরে মানগুলি পুনরায় নির্ধারণ করা দরকার because পি.লিস্ট থেকে আবার, বিগত কয়েক দিন ধরে কেবল আমার পড়ার উপর ভিত্তি করে।
ডেভ জি

। আচ্ছা, একটি .plist ফাইলে একটি অ্যারের সংরক্ষণ বেশ সহজবোধ্য (শ্রেণীবিন্যাসে সমস্ত বস্তু অ্যারেগুলির স্ট্রিং, অভিধান, বা নাম্বার (কোনও কাস্টম শ্রেণীর যেতে পারে)
নিকোলাস Miari

সম্মত হয়েছে, ফাইলটি পড়া বা কিছু-না-করা, তবে আপনি আপনার ডেটার কাঠামোর উপর নির্ভর করে আলাদা ফাইলগুলিতে বিভক্ত করতে পারেন। এবং কোরডাটার অন্তত সর্বশেষবার আমি যাচাই করেছিলাম, শিখার একটি গুরুত্বপূর্ণ বক্ররেখা ছিল।
নিকোলাস মিয়ারি

3
আমি বলব: পছন্দগুলি সংরক্ষণ করার জন্য এনএসউসারডেফাল্টগুলি ব্যবহার করুন (নামটি সর্বোপরি এর অর্থ কী), ধ্রুবক এবং / বা সংবেদনশীল ডেটা সঞ্চয় করার জন্য কীচেইন, খুব বেসিক অ্যাপ্লিকেশন উত্পন্ন ডেটার জন্য আপনার কাস্টম .plist ফাইলগুলির কাস্টম স্কিম এবং আরও ভারী স্টাফের জন্য কোরডেটা ।
নিকোলাস মিয়ারি

11

ওকে তাই @blloat এবং http://www.codingexplorer.com/nsuserdefaults-a-swift-intr پيداوار /- এর লিঙ্ককে ধন্যবাদ

আমি খুঁজে পেয়েছি যে উত্তরটি কিছু বেসিক স্ট্রিং স্টোরেজের জন্য বেশ সহজ।

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

এনএসকোডিং এবং এনএসকিড আর্চিভার ব্যবহার করা ডেটাগুলির জন্য আরও জটিল বিকল্প NSUserDefaultsযা এটির জন্য জটিল but এটি আপনাকে আরও আরও স্পষ্টভাবে ফাইলের কাঠামো পরিচালনা করার সুযোগ দেয় যা আপনি এনক্রিপশন ব্যবহার করতে চাইলে দুর্দান্ত is


7

সুইফট ৪.০ এর জন্য, এটি আরও সহজ হয়েছে:

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
ইউজারডেফাল্টস-এ আপনি লেখকদের মতো স্মিথ সংরক্ষণ করবেন না .. দয়া করে এর জন্য কীচেন ব্যবহার করুন
বিলাল রেফাস

5

সুইফট 3 এর জন্য

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

ডেটা সংরক্ষণের জন্য কেভিসি পদ্ধতি ব্যবহার করবেন না।
rmaddy

4

যে কারও কারও কারও জন্য ইউজার ডেফাল্টগুলি পরিচালনা করতে পছন্দ করবেন না, তাদের জন্য আরও একটি বিকল্প রয়েছে - এনএসকিডআরচিভার এবং এনএসকিডইনআর্কাইভার। এটি অর্চিভার ব্যবহার করে একটি ফাইলের মধ্যে অবজেক্টগুলি সংরক্ষণ করতে এবং আর্কাইভ করা ফাইলটিকে মূল অবজেক্টগুলিতে লোড করতে সহায়তা করে।

// 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?সেটার এবং সেই অনুযায়ী সংগ্রহকারী।

আশা করি এটি স্থানীয় ডেটা সংরক্ষণের জন্য ইউজার ডেফল্ট শ্রেণীর আরও শক্তি স্পষ্ট করে।

আপনার কতটুকু সঞ্চয় করা উচিত এবং কতবার, এই মন্তব্যটিতে হার্ডি_গারমানি এই পোস্টে একটি ভাল উত্তর দিয়েছেন , এটির একটি উদ্ধৃতি এখানে

ইতিমধ্যে উল্লিখিত হিসাবে অনেকগুলি: আমি একটি .plist (যেমন ব্যবহারকারীর ডেফাল্টস) -এ ডেটা সঞ্চয় করার জন্য কোনও আকারের সীমাবদ্ধতা (শারীরিক স্মৃতি ছাড়া) সম্পর্কে অবগত নই। সুতরাং এটি কতটা প্রশ্ন নয়।

আসল প্রশ্নটি আপনি নতুন / পরিবর্তিত মান লিখার পরেও হওয়া উচিত ... এবং এটি ব্যাটারি ড্রেনের সাথে সম্পর্কিত যা এই লেখার কারণ হবে।

আইওএসের কেবলমাত্র ডেটা অখণ্ডতা বজায় রাখার জন্য, যদি একটি একক মান পরিবর্তিত হয় তবে "ডিস্কে" কোনও শারীরিক লেখা এড়ানোর কোনও সুযোগ নেই। ইউজারডিফাল্টস সম্পর্কিত এটি পুরো ফাইলটি ডিস্কে আবার লিখিত হয়।

এটি "ডিস্ক "টিকে শক্তিশালী করে এবং এটিকে দীর্ঘ সময়ের জন্য চালিত রাখে এবং আইওএসকে কম পাওয়ার অবস্থায় যেতে বাধা দেয়।

নোটটিতে অন্য কিছু হিসাবে এই ব্যবহারকারীকে মোহাম্মদ রেজা Farahani উল্লেখ পোস্ট হয় অ্যাসিঙ্ক্রোনাস এবং সমকালীন userDefaults প্রকৃতি।

আপনি যখন কোনও ডিফল্ট মান সেট করেন, এটি আপনার প্রক্রিয়াটির মধ্যে এবং এককভাবে ক্রমাগত স্টোরেজ এবং অন্যান্য প্রক্রিয়াতে পরিবর্তিত হয়।

উদাহরণস্বরূপ, আপনি যদি প্রোগ্রামটি সংরক্ষণ এবং দ্রুত বন্ধ করে থাকেন তবে আপনি খেয়াল করতে পারেন এটি ফলাফলগুলি সংরক্ষণ করে না, কারণ এটি অবিচ্ছিন্নভাবে স্থির থাকে। আপনি এটি সর্বদা লক্ষ্য করতে পারবেন না তাই আপনি প্রোগ্রামটি বন্ধ করার আগে যদি আপনি সঞ্চয় করার পরিকল্পনা করেন তবে আপনি এটি শেষ করার জন্য কিছু সময় দিয়ে এইটির জন্য অ্যাকাউন্ট করতে চাইতে পারেন।

কারও কারও কাছে এর জন্য কিছু সুন্দর সমাধান থাকতে পারে তারা মন্তব্যগুলিতে ভাগ করতে পারে?


0

এনএসউসারডেফল্টস কেবলমাত্র ছোট ভেরিয়েবল আকার সংরক্ষণ করে। আপনি যদি অনেকগুলি বস্তু সংরক্ষণ করতে চান তবে আপনি কোরিডাটা স্থানীয় সমাধান হিসাবে ব্যবহার করতে পারেন বা আমি একটি লাইব্রেরি তৈরি করেছি যা আপনাকে .save () ফাংশন হিসাবে সহজ হিসাবে অবজেক্টগুলিকে সংরক্ষণ করতে সহায়তা করে। এটি এসকিউএলাইট ভিত্তিক।

SundeedQLite

এটি পরীক্ষা করে দেখুন এবং আপনার মন্তব্য আমাকে বলুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.