4 * StorageManager and KeyValueStorage usage example for Swift
5 * Demonstrates working with storage management, key-value storage operations, and data persistence
7class StorageManagerExample {
8 private var sdk: NavigineSdk?
9 private var storageManager: StorageManager?
10 private var userStorage: KeyValueStorage?
11 private var appStorage: KeyValueStorage?
12 private var cacheStorage: KeyValueStorage?
20 * Initialize SDK and get StorageManager
22 private func initializeSdk() {
24 // [swift_NavigineSdk_getInstance]
26 sdk = NavigineSdk.getInstance()
27 // [swift_NavigineSdk_getInstance]
29 // [swift_NavigineSdk_setUserHash]
31 sdk?.setUserHash("USER-HASH-HERE")
32 // [swift_NavigineSdk_setUserHash]
34 // [swift_NavigineSdk_setServer]
35 // Set server URL (optional)
36 sdk?.setServer("https://custom.navigine.com")
37 // [swift_NavigineSdk_setServer]
39 // [swift_NavigineSdk_getStorageManager]
40 // Get StorageManager for working with storages
41 storageManager = sdk?.getStorageManager()
42 // [swift_NavigineSdk_getStorageManager]
44 if storageManager != nil {
45 print("StorageManager successfully initialized")
48 print("Error initializing SDK: \(error)")
53 * Setup different storage instances
55 private func setupStorages() {
56 guard let storageManager = storageManager else {
57 print("StorageManager not initialized")
61 // [swift_StorageManager_getStorage]
62 // Get or create different storage instances
63 userStorage = storageManager.getStorage(name: "user_preferences")
64 appStorage = storageManager.getStorage(name: "app_settings")
65 cacheStorage = storageManager.getStorage(name: "cache")
66 // [swift_StorageManager_getStorage]
68 print("Storage instances created")
72 * Demonstrate StorageManager methods
74 func demonstrateStorageManagerMethods() {
75 guard let storageManager = storageManager else {
76 print("StorageManager not initialized")
80 // [swift_StorageManager_getStorageList]
81 // Get list of all existing storages
82 let storageList: [String] = storageManager.getStorageList()
83 print("Existing storages: \(storageList)")
84 // [swift_StorageManager_getStorageList]
86 // [swift_StorageManager_getStorage1]
87 // Get or create storage by name
88 let testStorage: KeyValueStorage = storageManager.getStorage(name: "test_storage")
89 print("Created test storage")
90 // [swift_StorageManager_getStorage1]
92 // Demonstrate storage creation and listing
93 storageManager.getStorage(name: "another_storage")
94 let updatedList: [String] = storageManager.getStorageList()
95 print("Updated storage list: \(updatedList)")
97 // [swift_StorageManager_removeStorage]
98 // Remove storage and all its data
99 storageManager.removeStorage(name: "test_storage")
100 print("Removed test storage")
101 // [swift_StorageManager_removeStorage]
103 let finalList: [String] = storageManager.getStorageList()
104 print("Final storage list: \(finalList)")
108 * Demonstrate KeyValueStorage methods
110 func demonstrateKeyValueStorageMethods() {
111 guard let userStorage = userStorage else {
112 print("User storage not initialized")
116 print("\n=== KeyValueStorage Methods Demonstration ===")
118 // [swift_KeyValueStorage_putString]
119 // Store string values
120 userStorage.putString(key: "user_name", value: "John Doe")
121 userStorage.putString(key: "user_email", value: "john.doe@example.com")
122 print("Stored string values")
123 // [swift_KeyValueStorage_putString]
125 // [swift_KeyValueStorage_putInt]
126 // Store integer values
127 userStorage.putInt(key: "user_age", value: 25)
128 userStorage.putInt(key: "login_count", value: 42)
129 print("Stored integer values")
130 // [swift_KeyValueStorage_putInt]
132 // [swift_KeyValueStorage_putLong]
134 userStorage.putLong(key: "registration_timestamp", value: 1640995200000)
135 userStorage.putLong(key: "last_login_timestamp", value: Int64(Date().timeIntervalSince1970 * 1000))
136 print("Stored long values")
137 // [swift_KeyValueStorage_putLong]
139 // [swift_KeyValueStorage_putBool]
140 // Store boolean values
141 userStorage.putBool(key: "is_premium", value: true)
142 userStorage.putBool(key: "notifications_enabled", value: false)
143 print("Stored boolean values")
144 // [swift_KeyValueStorage_putBool]
146 // [swift_KeyValueStorage_putFloat]
147 // Store float values
148 userStorage.putFloat(key: "user_rating", value: 4.5)
149 userStorage.putFloat(key: "temperature", value: 23.5)
150 print("Stored float values")
151 // [swift_KeyValueStorage_putFloat]
153 // [swift_KeyValueStorage_putDouble]
154 // Store double values
155 userStorage.putDouble(key: "user_location_lat", value: 55.7558)
156 userStorage.putDouble(key: "user_location_lng", value: 37.6176)
157 print("Stored double values")
158 // [swift_KeyValueStorage_putDouble]
160 // [swift_KeyValueStorage_contains]
161 // Check if keys exist
162 let hasUserName: Bool = userStorage.contains(key: "user_name")
163 let hasNonExistent: Bool = userStorage.contains(key: "non_existent_key")
164 print("Contains 'user_name': \(hasUserName)")
165 print("Contains 'non_existent_key': \(hasNonExistent)")
166 // [swift_KeyValueStorage_contains]
168 // [swift_KeyValueStorage_getKeys]
169 // Get all stored keys
170 let allKeys: [String] = userStorage.getKeys()
171 print("All stored keys: \(allKeys)")
172 // [swift_KeyValueStorage_getKeys]
174 // [swift_KeyValueStorage_getString]
175 // Retrieve string values with defaults
176 let userName: String = userStorage.getString(key: "user_name", defaultValue: "Unknown")
177 let userEmail: String = userStorage.getString(key: "user_email", defaultValue: "")
178 let nonExistent: String = userStorage.getString(key: "non_existent_key", defaultValue: "default_value")
179 print("User name: \(userName)")
180 print("User email: \(userEmail)")
181 print("Non-existent key: \(nonExistent)")
182 // [swift_KeyValueStorage_getString]
184 // [swift_KeyValueStorage_getInt]
185 // Retrieve integer values with defaults
186 let userAge: Int32 = userStorage.getInt(key: "user_age", defaultValue: 0)
187 let loginCount: Int32 = userStorage.getInt(key: "login_count", defaultValue: 0)
188 let nonExistentInt: Int32 = userStorage.getInt(key: "non_existent_int", defaultValue: -1)
189 print("User age: \(userAge)")
190 print("Login count: \(loginCount)")
191 print("Non-existent int: \(nonExistentInt)")
192 // [swift_KeyValueStorage_getInt]
194 // [swift_KeyValueStorage_getLong]
195 // Retrieve long values with defaults
196 let regTimestamp: Int64 = userStorage.getLong(key: "registration_timestamp", defaultValue: 0)
197 let lastLogin: Int64 = userStorage.getLong(key: "last_login_timestamp", defaultValue: 0)
198 let nonExistentLong: Int64 = userStorage.getLong(key: "non_existent_long", defaultValue: -1)
199 print("Registration timestamp: \(regTimestamp)")
200 print("Last login timestamp: \(lastLogin)")
201 print("Non-existent long: \(nonExistentLong)")
202 // [swift_KeyValueStorage_getLong]
204 // [swift_KeyValueStorage_getBool]
205 // Retrieve boolean values with defaults
206 let isPremium: Bool = userStorage.getBool(key: "is_premium", defaultValue: false)
207 let notificationsEnabled: Bool = userStorage.getBool(key: "notifications_enabled", defaultValue: true)
208 let nonExistentBool: Bool = userStorage.getBool(key: "non_existent_bool", defaultValue: false)
209 print("Is premium: \(isPremium)")
210 print("Notifications enabled: \(notificationsEnabled)")
211 print("Non-existent bool: \(nonExistentBool)")
212 // [swift_KeyValueStorage_getBool]
214 // [swift_KeyValueStorage_getFloat]
215 // Retrieve float values with defaults
216 let userRating: Float = userStorage.getFloat(key: "user_rating", defaultValue: 0.0)
217 let temperature: Float = userStorage.getFloat(key: "temperature", defaultValue: 0.0)
218 let nonExistentFloat: Float = userStorage.getFloat(key: "non_existent_float", defaultValue: -1.0)
219 print("User rating: \(userRating)")
220 print("Temperature: \(temperature)")
221 print("Non-existent float: \(nonExistentFloat)")
222 // [swift_KeyValueStorage_getFloat]
224 // [swift_KeyValueStorage_getDouble]
225 // Retrieve double values with defaults
226 let userLat: Double = userStorage.getDouble(key: "user_location_lat", defaultValue: 0.0)
227 let userLng: Double = userStorage.getDouble(key: "user_location_lng", defaultValue: 0.0)
228 let nonExistentDouble: Double = userStorage.getDouble(key: "non_existent_double", defaultValue: -1.0)
229 print("User location lat: \(userLat)")
230 print("User location lng: \(userLng)")
231 print("Non-existent double: \(nonExistentDouble)")
232 // [swift_KeyValueStorage_getDouble]
234 // [swift_KeyValueStorage_remove]
235 // Remove specific keys
236 userStorage.remove(key: "user_age")
237 userStorage.remove(key: "non_existent_key") // No-op
238 print("Removed 'user_age' key")
239 // [swift_KeyValueStorage_remove]
242 let stillHasAge: Bool = userStorage.contains(key: "user_age")
243 print("Still contains 'user_age': \(stillHasAge)")
245 // [swift_KeyValueStorage_clear]
248 print("Cleared all data from user storage")
249 // [swift_KeyValueStorage_clear]
252 let keysAfterClear: [String] = userStorage.getKeys()
253 print("Keys after clear: \(keysAfterClear)")
257 * Demonstrate multiple storages
259 func demonstrateMultipleStorages() {
260 guard let userStorage = userStorage,
261 let appStorage = appStorage,
262 let cacheStorage = cacheStorage else {
263 print("Storages not initialized")
267 print("\n=== Multiple Storages Demonstration ===")
269 // Store different data in different storages
270 userStorage.putString(key: "name", value: "John Doe")
271 userStorage.putInt(key: "age", value: 25)
272 userStorage.putBool(key: "is_premium", value: true)
274 appStorage.putString(key: "theme", value: "dark")
275 appStorage.putInt(key: "api_version", value: 2)
276 appStorage.putBool(key: "debug_mode", value: false)
278 cacheStorage.putLong(key: "last_update", value: Int64(Date().timeIntervalSince1970 * 1000))
279 cacheStorage.putString(key: "api_token", value: "abc123")
280 cacheStorage.putDouble(key: "cached_rating", value: 4.2)
282 // Retrieve data from different storages
283 print("User storage data:")
284 demonstrateStorageData(storage: userStorage)
286 print("\nApp storage data:")
287 demonstrateStorageData(storage: appStorage)
289 print("\nCache storage data:")
290 demonstrateStorageData(storage: cacheStorage)
294 * Demonstrate storage data
296 private func demonstrateStorageData(storage: KeyValueStorage) {
297 let keys: [String] = storage.getKeys()
299 if storage.contains(key: key) {
300 // Try to get value as string first
301 let stringValue: String = storage.getString(key: key, defaultValue: "")
302 if !stringValue.isEmpty {
303 print(" \(key): \(stringValue) (string)")
308 let intValue: Int32 = storage.getInt(key: key, defaultValue: -999999)
309 if intValue != -999999 {
310 print(" \(key): \(intValue) (int)")
315 let longValue: Int64 = storage.getLong(key: key, defaultValue: -999999)
316 if longValue != -999999 {
317 print(" \(key): \(longValue) (long)")
322 let boolValue: Bool = storage.getBool(key: key, defaultValue: false)
323 if storage.contains(key: key) {
324 print(" \(key): \(boolValue) (bool)")
329 let floatValue: Float = storage.getFloat(key: key, defaultValue: -999999.0)
330 if floatValue != -999999.0 {
331 print(" \(key): \(floatValue) (float)")
336 let doubleValue: Double = storage.getDouble(key: key, defaultValue: -999999.0)
337 if doubleValue != -999999.0 {
338 print(" \(key): \(doubleValue) (double)")
345 * Demonstrate storage analytics
347 func demonstrateStorageAnalytics() {
348 guard let storageManager = storageManager else {
349 print("StorageManager not initialized")
353 print("\n=== Storage Analytics ===")
355 // Analyze all storages
356 let allStorages: [String] = storageManager.getStorageList()
357 print("Total storages: \(allStorages.count)")
359 for storageName in allStorages {
360 let storage: KeyValueStorage = storageManager.getStorage(name: storageName)
361 let keys: [String] = storage.getKeys()
362 print("Storage '\(storageName)' contains \(keys.count) items")
364 // Analyze data types
373 // Count by trying to get each type
374 let stringValue: String = storage.getString(key: key, defaultValue: "")
375 if !stringValue.isEmpty {
380 let intValue: Int32 = storage.getInt(key: key, defaultValue: -999999)
381 if intValue != -999999 {
386 let longValue: Int64 = storage.getLong(key: key, defaultValue: -999999)
387 if longValue != -999999 {
392 let boolValue: Bool = storage.getBool(key: key, defaultValue: false)
393 if storage.contains(key: key) {
398 let floatValue: Float = storage.getFloat(key: key, defaultValue: -999999.0)
399 if floatValue != -999999.0 {
404 let doubleValue: Double = storage.getDouble(key: key, defaultValue: -999999.0)
405 if doubleValue != -999999.0 {
410 print(" - Strings: \(stringCount)")
411 print(" - Integers: \(intCount)")
412 print(" - Longs: \(longCount)")
413 print(" - Booleans: \(boolCount)")
414 print(" - Floats: \(floatCount)")
415 print(" - Doubles: \(doubleCount)")
420 * Demonstrate data migration
422 func demonstrateDataMigration() {
423 guard let storageManager = storageManager else {
424 print("StorageManager not initialized")
428 print("\n=== Data Migration Demonstration ===")
430 // Create old and new storages
431 let oldStorage: KeyValueStorage = storageManager.getStorage(name: "old_storage")
432 let newStorage: KeyValueStorage = storageManager.getStorage(name: "new_storage")
434 // Populate old storage with data
435 oldStorage.putString(key: "name", value: "John Doe")
436 oldStorage.putInt(key: "age", value: 25)
437 oldStorage.putBool(key: "is_premium", value: true)
438 oldStorage.putDouble(key: "rating", value: 4.5)
440 print("Old storage before migration:")
441 demonstrateStorageData(storage: oldStorage)
443 // Migrate data from old to new storage
444 let keys: [String] = oldStorage.getKeys()
446 // Migrate string data
447 let stringValue: String = oldStorage.getString(key: key, defaultValue: "")
448 if !stringValue.isEmpty {
449 newStorage.putString(key: key, value: stringValue)
453 // Migrate integer data
454 let intValue: Int32 = oldStorage.getInt(key: key, defaultValue: -999999)
455 if intValue != -999999 {
456 newStorage.putInt(key: key, value: intValue)
461 let longValue: Int64 = oldStorage.getLong(key: key, defaultValue: -999999)
462 if longValue != -999999 {
463 newStorage.putLong(key: key, value: longValue)
467 // Migrate boolean data
468 let boolValue: Bool = oldStorage.getBool(key: key, defaultValue: false)
469 if oldStorage.contains(key: key) {
470 newStorage.putBool(key: key, value: boolValue)
474 // Migrate float data
475 let floatValue: Float = oldStorage.getFloat(key: key, defaultValue: -999999.0)
476 if floatValue != -999999.0 {
477 newStorage.putFloat(key: key, value: floatValue)
481 // Migrate double data
482 let doubleValue: Double = oldStorage.getDouble(key: key, defaultValue: -999999.0)
483 if doubleValue != -999999.0 {
484 newStorage.putDouble(key: key, value: doubleValue)
488 print("\nNew storage after migration:")
489 demonstrateStorageData(storage: newStorage)
491 // Remove old storage
492 storageManager.removeStorage(name: "old_storage")
493 print("\nRemoved old storage")
496 let finalStorages: [String] = storageManager.getStorageList()
497 print("Final storage list: \(finalStorages)")
501 * Demonstrate storage cleanup
503 func demonstrateStorageCleanup() {
504 guard let storageManager = storageManager else {
505 print("StorageManager not initialized")
509 print("\n=== Storage Cleanup Demonstration ===")
511 // Create some temporary storages
512 storageManager.getStorage(name: "temp_cache_1")
513 storageManager.getStorage(name: "temp_cache_2")
514 storageManager.getStorage(name: "permanent_storage")
516 let beforeCleanup: [String] = storageManager.getStorageList()
517 print("Storages before cleanup: \(beforeCleanup)")
519 // Clean up temporary storages
520 let storages: [String] = storageManager.getStorageList()
521 for storageName in storages {
522 if storageName.hasPrefix("temp_") {
523 storageManager.removeStorage(name: storageName)
524 print("Removed temporary storage: \(storageName)")
528 let afterCleanup: [String] = storageManager.getStorageList()
529 print("Storages after cleanup: \(afterCleanup)")
533 * Run all demonstrations
535 func runAllDemonstrations() {
536 print("=== StorageManager and KeyValueStorage Examples ===\n")
538 demonstrateStorageManagerMethods()
539 demonstrateKeyValueStorageMethods()
540 demonstrateMultipleStorages()
541 demonstrateStorageAnalytics()
542 demonstrateDataMigration()
543 demonstrateStorageCleanup()
545 print("\n=== All demonstrations completed ===")
552 guard let storageManager = storageManager else { return }
554 // Remove test storages
555 let storages: [String] = storageManager.getStorageList()
556 for storageName in storages {
557 if storageName.hasPrefix("test_") ||
558 storageName.hasPrefix("temp_") ||
559 storageName.hasPrefix("old_") ||
560 storageName.hasPrefix("new_") {
561 storageManager.removeStorage(name: storageName)
568 * Main function to run the example
571 let example = StorageManagerExample()
573 // Run all demonstrations
574 example.runAllDemonstrations()
579 print("Example completed successfully!")