SlideShare a Scribd company logo
iOS Internship 2014
Хранение данных
Папки приложения
NSFileManager, NSURL
NSCoding
NSUserDefaults
SQLite
лекция 6
Хранение данных
Хранение данных
Принципиально выделяются следующие способы хранения данных:
● UserDefaults
● Файлы
○ plist
○ NSCoding
○ БД SQLite
○ кастомные форматы
● CoreData (физически данные хранятся как правило в SQLite файле)
Хранение данных в iOS
Хранение данных
Наиболее простой способ сохранить / загрузить данные. Используется в основном для
хранения настроек приложения и других мелких сущностей. Работает только с ограниченным
набором стандартных типов.
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:42 forKey:@"MyInteger"];
[userDefaults setObject:@"SomeString" forKey:@"MyString"];
[userDefaults setBool:YES forKey:@"MyFlag"];
[userDefaults synchronize];
BOOL myFlag = [userDefaults boolForKey:@"MyFlag"];
NSInteger myInt = [userDefaults integerForKey:@"MyInteger"];
NSString *myString = [userDefaults objectForKey:@"MyString"];
NSUserDefaults
Хранение данных
Каждое приложение выполняется в “песочнице”, в том числе имеет доступ только к своим
папкам. У каждого приложения есть следующий набор папок:
● NSDocumentDirectory — документы (бэкапятся, видны пользователю в iTunes)
● NSLibraryDirectory — настройки, БД и т.д. (бэкапятся, но не видны пользователю)
● NSCachesDirectory — файлы, которые гарантированно могут быть скачаны снова (не
бэкапятся и могут быть автоматически удалены системой при нехватке памяти).
● NSDownloadsDirectory — не будут удалены системой, но не бэкапятся.
● …
Хранение данных в iOS
Хранение данных
Ресурсы приложения хранятся отдельно и доступны только для чтения.
По умолчанию все ресурсы приложения попадают в одну папку, и должны иметь разные имена
(или явно указывать какие папки проекта должны сохранять структуру при копировании в
ресурсы).
Получение пути к ресурсу по имени файла:
[[NSBundle mainBundle] pathForResource:@"filename" ofType:@"ext"];
Хранение данных в iOS
Хранение данных
NSArray *docsDirs = nil;
NSString *docsDir = nil;
...
docsDirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [docsDirs objectAtIndex:0];
Получение пути к документам
Хранение данных
NSFileManager позволяет получать список, размеры и атрибуты, проверять наличие по
заданному пути, создавать, переносить и удалять файлы и папки, создавать и удалять
символические ссылки, а также управлять хранением бэкапов файлов в iCloud.
NSFileManager
Хранение данных
Создаём директорию и получаем новый список файлов и каталогов в домашней директории:
NSString *path = [docsDir stringByAppendingPathComponent:@"MyDir"];
NSError *error = nil;
[[NSFileManager defaultManager]
createDirectoryAtPath:path
withIntermediateDirectories:YES
attributes:nil
error:&error];
NSArray *contents =
[[NSFileManager defaultManager]
contentsOfDirectoryAtPath:docsDir
error:&error];
NSFileManager
Хранение данных
NSString в файле
Сохранение и загрузка строки в / из файла:
[@"42"
writeToFile:filepath
atomically:YES
encoding:NSUTF8StringEncoding
error:&error];
NSString *string =
[NSString
stringWithContentsOfFile:filepath
encoding:NSUTF8StringEncoding
error:&error];
Хранение данных
PList (Property List) — стандартный для iOS и MacOS формат хранения стандартных коллекций,
содержащих данные стандартных типов:
● NSString — UTF-8 строка
● NSNumber — Строка с десятичным числом
● NSNumber <true/> или <false/>
● NSDate — ISO 8601 представление
● NSData — Base64 представление
● NSArray — <array>, может содержать любое количество других объектов
● NSDictionary <dict>, чередование <key> и других объектов
PList
Хранение данных
На самом деле это обычный XML:
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
</dict>
</plist>
PList
Хранение данных
Сохранение и загрузка массива в / из файла:
[@[@2, @3, @4] writeToFile:filepath atomically:YES];
NSArray *array = [NSArray arrayWithContentsOfFile:filepath];
Сохранение и загрузка словаря в / из файла:
[@{@"2": @2, @"3": @3} writeToFile:filepath atomically:YES];
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:filepath];
Хранение коллекций в PList
Хранение данных
NSCoding — протокол, абстрагирующий возможность сериализации и десериализации любых
объектов.
NSCoder — абстрактный класс, представляющий набор методов для сериализации /
десериализации объектов.
NSKeyedArchiver / NSKeyedUnarchiver — конкретные реализации NSCoder, отвечающие
за сериализацию / десериализацию полей объекта по ключам и предоставляющие возможность
использовать файл как хранилище.
NSCoding
Хранение данных
@interface Department ()
@property (copy, nonatomic) NSArray *people;
@end
static NSString *peopleFilename() { return /*...*/; }
@implementation Department
- (void)loadPeople
{
self.people = [NSKeyedUnarchiver unarchiveObjectWithFile:peopleFilename()];
}
- (void)savePeople
{
[NSKeyedArchiver
archiveRootObject:self.people
toFile:peopleFilename()];
}
@end
NSCoding
Хранение данных
NSCoding
@interface Person : NSObject <NSCoding>
@property (copy, nonatomic) NSString *name;
@property (readwrite, nonatomic) NSInteger age;
@end
@implementation Person
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInteger:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)decoder
{
// if ([super conformsToProtocol:@protocol(NSCoding)]) { ... }
if ((self = [self init])) {
name_ = [decoder decodeObjectForKey:@"name"];
age_ = [decoder decodeIntegerForKey:@"age"];
}
return self;
}
@end
Хранение данных
@interface Person : NSObject <NSCoding>
@property (copy, nonatomic) NSString *name;
@property (readwrite, nonatomic) NSInteger age;
@end
@implementation Person
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInteger:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)decoder
{
// if ([super conformsToProtocol:@protocol(NSCoding)]) { ... }
if ((self = [self init])) {
name_ = [decoder decodeObjectForKey:@"name"];
age_ = [decoder decodeIntegerForKey:@"age"];
}
return self;
}
@end
Только программист отвечает
за соответствие ключей.
Если в очередной версии
программы появится новое
поле, и мы попытаемся
загрузить новый объект из
старого файла, возникнет
исключение.
NSCoding
Хранение данных
Как избежать ошибок при загрузке объекта:
● Проверять наличие соответствующего поля методом
- (BOOL)containsValueForKey:(NSString *)key
● Не использовать строковые литералы для ключей, а использовать например следующую
обёртку, позволяющую компилятору находить ошибки в ключах:
#define STR_PROP( prop ) NSStringFromSelector(@selector(prop))
[coder encodeObject:self.someProp forKey:STR_PROP(someProp)];
● Хранить номер версии формата объекта и перед загрузкой остальных полей выбирать
десериализатор соответствующей версии.
NSCoding
Хранение данных
При работе с БД:
● Объём вспомогательного кода больше.
● О надёжности и производительности думает отдельный компонент.
● Хорошо подходит для работы с большим количеством однородных данных.
● Продвинутые возможности поиска, фильтров и других "хитрых" запросов.
DB vs NSCoding
Хранение данных
● Реляционная БД, ограниченно поддерживающая SQL.
● Популярный стандарт с open-source реализацией. Написан на C. Поддерживается практически на всех
платформах.
● Очень надёжная реализация. (Объём тестов в >1000 раз больше самой реализации.)
● Богатая документация.
● Стандартно поддерживается iOS SDK.
● Упрощённая схема общения между клиентским кодом и движком БД (движок встраивается прямо в
программу). Это упрощает код и ускоряет общение с БД.
● Упрощённая схема физического хранения данных (всё в одном блокируемом файле).
● Тип столбца не определяет тип хранимого значения, то есть в любой столбец можно занести любое
значение.
Хранение данных
пример запроса (чтение нескольких строк)
sqlite3 *_contactDB;
NSString *_databasePath;
char *query_stmt = [@"SELECT name FROM people WHERE age=30" UTF8String];
char *dbpath = [_databasePath UTF8String];
sqlite3_stmt *statement;
//...
sqlite3_open(dbpath, &_contactDB);
sqlite3_prepare_v2(_contactDB, query_stmt, -1, &statement, NULL);
while (sqlite3_step(statement) == SQLITE_ROW) {
NSString *name = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text
(statement, 0)];
//...
}
sqlite3_finalize(statement);
sqlite3_close(_contactDB);
Хранение данных
FMDB
● Сторонняя библиотека с открытым исходным кодом.
● Обёртка поверх SQLite.
● Предоставляет API для SQLite на Objective-C (не C).
● Удобное приведение данных к нужному типу.
● Удобное асинхронное выполнение транзакций в блоках.
Хранение данных
NSString *dbPath = /*...*/;
NSString *createTableQuery = @"CREATE TABLE people (id INTEGER PRIMARY KEY DEFAULT NULL, name
TEXT DEFAULT NULL, age INTEGER DEFAULT NULL)";
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
[database executeUpdate:createTableQuery];
[database close];
FMDB пример запроса (создание таблицы)
Хранение данных
FMDB пример запроса (вставка нескольких строк)
FMDatabaseQueue *queue = [[FMDatabaseQueue alloc] initWithPath:dbPath];
[queue inDatabase:^(FMDatabase *db) {
[db beginTransaction];
for (Person *person in people) {
[db executeUpdate:@"INSERT INTO people (name, age) VALUES (?, ?)",
person.name,
@(person.age)];
}
[db commit];
}];
Хранение данных
FMDatabaseQueue *queue = [[FMDatabaseQueue alloc] initWithPath:dbPath];
[queue inDatabase:^(FMDatabase *db) {
FMResultSet *results = [db executeQuery:@"SELECT * FROM people WHERE age=?", @30];
while ([results next]) {
NSString *name = [results stringForColumn:@"name"];
int age = [results intForColumn:@"age"];
//...
}
}];
FMDB пример запроса (чтение нескольких строк)

More Related Content

What's hot

basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
Roman Dvornov
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen Applications
Vittorio Cioe
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
Vasya Petrov
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
Evgeniy Kuzmin
 
Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDB
Dmitry Viskov
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
DrupalCampDN
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
Andrey Zakharevich
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
Roman Dvornov
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Technopark
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Roman Dvornov
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
delimitry
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
CocoaHeads
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
Noveo
 

What's hot (20)

basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen Applications
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
 
Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDB
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
лабраб 1
лабраб 1лабраб 1
лабраб 1
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3
 
Yii development
Yii developmentYii development
Yii development
 
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
CodeFest 2012. Рычков Д. — Почему перед написанием кеша вам стоит поговорить ...
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 

Similar to хранение данных

Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиГлеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсИнтуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсГлеб Тарасов
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
Dmitriy Kuragin
 
Swift School #3
Swift School #3Swift School #3
Swift School #3
Sergey Pronin
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
Denis Shestakov
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭOleg Parinov
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
Alexandre Kalendarev
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Vladimir Kochetkov
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
Глеб Тарасов
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
Positive Hack Days
 
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Yandex
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
CocoaHeads
 
Squeek 1
Squeek 1Squeek 1
Squeek 1
Oleg Parinov
 
09 ns data
09   ns data09   ns data
09 ns data
Noveo
 

Similar to хранение данных (20)

Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсИнтуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
Swift School #3
Swift School #3Swift School #3
Swift School #3
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
Squeek school #6
Squeek school #6Squeek school #6
Squeek school #6
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
Дмитрий Прокопцев "Memory-mapped storage: ещё один подход к сериализации данных"
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
 
Squeek 1
Squeek 1Squeek 1
Squeek 1
 
09 ns data
09   ns data09   ns data
09 ns data
 

More from Noveo

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
Noveo
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
Noveo
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Noveo
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
Noveo
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
Noveo
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
Noveo
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
Noveo
 
Yii2
Yii2Yii2
Yii2
Noveo
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
Noveo
 
Rest
RestRest
Rest
Noveo
 
PHP basic
PHP basicPHP basic
PHP basic
Noveo
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
Noveo
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
Noveo
 
MySQL
MySQLMySQL
MySQL
Noveo
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)
Noveo
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
Noveo
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
Noveo
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
Noveo
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
Noveo
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
Noveo
 

More from Noveo (20)

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
 
Yii2
Yii2Yii2
Yii2
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
 
Rest
RestRest
Rest
 
PHP basic
PHP basicPHP basic
PHP basic
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
MySQL
MySQLMySQL
MySQL
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 

хранение данных

  • 3. Хранение данных Принципиально выделяются следующие способы хранения данных: ● UserDefaults ● Файлы ○ plist ○ NSCoding ○ БД SQLite ○ кастомные форматы ● CoreData (физически данные хранятся как правило в SQLite файле) Хранение данных в iOS
  • 4. Хранение данных Наиболее простой способ сохранить / загрузить данные. Используется в основном для хранения настроек приложения и других мелких сущностей. Работает только с ограниченным набором стандартных типов. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setInteger:42 forKey:@"MyInteger"]; [userDefaults setObject:@"SomeString" forKey:@"MyString"]; [userDefaults setBool:YES forKey:@"MyFlag"]; [userDefaults synchronize]; BOOL myFlag = [userDefaults boolForKey:@"MyFlag"]; NSInteger myInt = [userDefaults integerForKey:@"MyInteger"]; NSString *myString = [userDefaults objectForKey:@"MyString"]; NSUserDefaults
  • 5. Хранение данных Каждое приложение выполняется в “песочнице”, в том числе имеет доступ только к своим папкам. У каждого приложения есть следующий набор папок: ● NSDocumentDirectory — документы (бэкапятся, видны пользователю в iTunes) ● NSLibraryDirectory — настройки, БД и т.д. (бэкапятся, но не видны пользователю) ● NSCachesDirectory — файлы, которые гарантированно могут быть скачаны снова (не бэкапятся и могут быть автоматически удалены системой при нехватке памяти). ● NSDownloadsDirectory — не будут удалены системой, но не бэкапятся. ● … Хранение данных в iOS
  • 6. Хранение данных Ресурсы приложения хранятся отдельно и доступны только для чтения. По умолчанию все ресурсы приложения попадают в одну папку, и должны иметь разные имена (или явно указывать какие папки проекта должны сохранять структуру при копировании в ресурсы). Получение пути к ресурсу по имени файла: [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"ext"]; Хранение данных в iOS
  • 7. Хранение данных NSArray *docsDirs = nil; NSString *docsDir = nil; ... docsDirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); docsDir = [docsDirs objectAtIndex:0]; Получение пути к документам
  • 8. Хранение данных NSFileManager позволяет получать список, размеры и атрибуты, проверять наличие по заданному пути, создавать, переносить и удалять файлы и папки, создавать и удалять символические ссылки, а также управлять хранением бэкапов файлов в iCloud. NSFileManager
  • 9. Хранение данных Создаём директорию и получаем новый список файлов и каталогов в домашней директории: NSString *path = [docsDir stringByAppendingPathComponent:@"MyDir"]; NSError *error = nil; [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]; NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsDir error:&error]; NSFileManager
  • 10. Хранение данных NSString в файле Сохранение и загрузка строки в / из файла: [@"42" writeToFile:filepath atomically:YES encoding:NSUTF8StringEncoding error:&error]; NSString *string = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:&error];
  • 11. Хранение данных PList (Property List) — стандартный для iOS и MacOS формат хранения стандартных коллекций, содержащих данные стандартных типов: ● NSString — UTF-8 строка ● NSNumber — Строка с десятичным числом ● NSNumber <true/> или <false/> ● NSDate — ISO 8601 представление ● NSData — Base64 представление ● NSArray — <array>, может содержать любое количество других объектов ● NSDictionary <dict>, чередование <key> и других объектов PList
  • 12. Хранение данных На самом деле это обычный XML: <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>en</string> <key>LSRequiresIPhoneOS</key> <true/> <key>UIRequiredDeviceCapabilities</key> <array> <string>armv7</string> </array> </dict> </plist> PList
  • 13. Хранение данных Сохранение и загрузка массива в / из файла: [@[@2, @3, @4] writeToFile:filepath atomically:YES]; NSArray *array = [NSArray arrayWithContentsOfFile:filepath]; Сохранение и загрузка словаря в / из файла: [@{@"2": @2, @"3": @3} writeToFile:filepath atomically:YES]; NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:filepath]; Хранение коллекций в PList
  • 14. Хранение данных NSCoding — протокол, абстрагирующий возможность сериализации и десериализации любых объектов. NSCoder — абстрактный класс, представляющий набор методов для сериализации / десериализации объектов. NSKeyedArchiver / NSKeyedUnarchiver — конкретные реализации NSCoder, отвечающие за сериализацию / десериализацию полей объекта по ключам и предоставляющие возможность использовать файл как хранилище. NSCoding
  • 15. Хранение данных @interface Department () @property (copy, nonatomic) NSArray *people; @end static NSString *peopleFilename() { return /*...*/; } @implementation Department - (void)loadPeople { self.people = [NSKeyedUnarchiver unarchiveObjectWithFile:peopleFilename()]; } - (void)savePeople { [NSKeyedArchiver archiveRootObject:self.people toFile:peopleFilename()]; } @end NSCoding
  • 16. Хранение данных NSCoding @interface Person : NSObject <NSCoding> @property (copy, nonatomic) NSString *name; @property (readwrite, nonatomic) NSInteger age; @end @implementation Person - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.name forKey:@"name"]; [coder encodeInteger:self.age forKey:@"age"]; } - (instancetype)initWithCoder:(NSCoder *)decoder { // if ([super conformsToProtocol:@protocol(NSCoding)]) { ... } if ((self = [self init])) { name_ = [decoder decodeObjectForKey:@"name"]; age_ = [decoder decodeIntegerForKey:@"age"]; } return self; } @end
  • 17. Хранение данных @interface Person : NSObject <NSCoding> @property (copy, nonatomic) NSString *name; @property (readwrite, nonatomic) NSInteger age; @end @implementation Person - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.name forKey:@"name"]; [coder encodeInteger:self.age forKey:@"age"]; } - (instancetype)initWithCoder:(NSCoder *)decoder { // if ([super conformsToProtocol:@protocol(NSCoding)]) { ... } if ((self = [self init])) { name_ = [decoder decodeObjectForKey:@"name"]; age_ = [decoder decodeIntegerForKey:@"age"]; } return self; } @end Только программист отвечает за соответствие ключей. Если в очередной версии программы появится новое поле, и мы попытаемся загрузить новый объект из старого файла, возникнет исключение. NSCoding
  • 18. Хранение данных Как избежать ошибок при загрузке объекта: ● Проверять наличие соответствующего поля методом - (BOOL)containsValueForKey:(NSString *)key ● Не использовать строковые литералы для ключей, а использовать например следующую обёртку, позволяющую компилятору находить ошибки в ключах: #define STR_PROP( prop ) NSStringFromSelector(@selector(prop)) [coder encodeObject:self.someProp forKey:STR_PROP(someProp)]; ● Хранить номер версии формата объекта и перед загрузкой остальных полей выбирать десериализатор соответствующей версии. NSCoding
  • 19. Хранение данных При работе с БД: ● Объём вспомогательного кода больше. ● О надёжности и производительности думает отдельный компонент. ● Хорошо подходит для работы с большим количеством однородных данных. ● Продвинутые возможности поиска, фильтров и других "хитрых" запросов. DB vs NSCoding
  • 20. Хранение данных ● Реляционная БД, ограниченно поддерживающая SQL. ● Популярный стандарт с open-source реализацией. Написан на C. Поддерживается практически на всех платформах. ● Очень надёжная реализация. (Объём тестов в >1000 раз больше самой реализации.) ● Богатая документация. ● Стандартно поддерживается iOS SDK. ● Упрощённая схема общения между клиентским кодом и движком БД (движок встраивается прямо в программу). Это упрощает код и ускоряет общение с БД. ● Упрощённая схема физического хранения данных (всё в одном блокируемом файле). ● Тип столбца не определяет тип хранимого значения, то есть в любой столбец можно занести любое значение.
  • 21. Хранение данных пример запроса (чтение нескольких строк) sqlite3 *_contactDB; NSString *_databasePath; char *query_stmt = [@"SELECT name FROM people WHERE age=30" UTF8String]; char *dbpath = [_databasePath UTF8String]; sqlite3_stmt *statement; //... sqlite3_open(dbpath, &_contactDB); sqlite3_prepare_v2(_contactDB, query_stmt, -1, &statement, NULL); while (sqlite3_step(statement) == SQLITE_ROW) { NSString *name = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text (statement, 0)]; //... } sqlite3_finalize(statement); sqlite3_close(_contactDB);
  • 22. Хранение данных FMDB ● Сторонняя библиотека с открытым исходным кодом. ● Обёртка поверх SQLite. ● Предоставляет API для SQLite на Objective-C (не C). ● Удобное приведение данных к нужному типу. ● Удобное асинхронное выполнение транзакций в блоках.
  • 23. Хранение данных NSString *dbPath = /*...*/; NSString *createTableQuery = @"CREATE TABLE people (id INTEGER PRIMARY KEY DEFAULT NULL, name TEXT DEFAULT NULL, age INTEGER DEFAULT NULL)"; FMDatabase *database = [FMDatabase databaseWithPath:dbPath]; [database open]; [database executeUpdate:createTableQuery]; [database close]; FMDB пример запроса (создание таблицы)
  • 24. Хранение данных FMDB пример запроса (вставка нескольких строк) FMDatabaseQueue *queue = [[FMDatabaseQueue alloc] initWithPath:dbPath]; [queue inDatabase:^(FMDatabase *db) { [db beginTransaction]; for (Person *person in people) { [db executeUpdate:@"INSERT INTO people (name, age) VALUES (?, ?)", person.name, @(person.age)]; } [db commit]; }];
  • 25. Хранение данных FMDatabaseQueue *queue = [[FMDatabaseQueue alloc] initWithPath:dbPath]; [queue inDatabase:^(FMDatabase *db) { FMResultSet *results = [db executeQuery:@"SELECT * FROM people WHERE age=?", @30]; while ([results next]) { NSString *name = [results stringForColumn:@"name"]; int age = [results intForColumn:@"age"]; //... } }]; FMDB пример запроса (чтение нескольких строк)