squeek school

                          Разработка приложений для iOS




суббота, 21 мая 2011 г.
Хранение данных


             • Xml (plist)
             • SQLite



суббота, 21 мая 2011 г.
Хранение данных
                                                Property Lists

       •      Property Lists - для небольшого объема

       •         Writing an Array to Disk
              хранит обычные форматы данных iOS
                          NSArray *array = [NSArray arrayWithObjects:@“Foo”,
                                            [NSNumber numberWithBool:YES],
                                            [NSDate dateWithTimeIntervalSinceNow:60],
                                            nil];
                          [array writeToFile:@“MyArray.plist” atomically:YES];
                          NSArray * a = [NSArray arrayWithContentsOfFile:xmlFile];

                              <?xml version="1.0" encoding="UTF-8"?>
                              <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
                              "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
                              <plist version="1.0">
                              <array>
                               	    <string>Foo</string>
                               	    <true/>
                               	    <date>2010-02-02T09:26:18Z</date>
                              </array>
                              </plist>
суббота, 21 мая 2011 г.
Хранение данных
                                  в настройках




          [[NSUserDefaults standardUserDefaults] setObject: ForKey:];

                [[NSUserDefaults standardUserDefaults] objectForKey:];
                  [[NSUserDefaults standardUserDefaults] synchonize];




суббота, 21 мая 2011 г.
песочница




суббота, 21 мая 2011 г.
а что внутри?
                    Home Directory Layout
                    • Each app has its own set of directories
                                                  я!
                    • <Application Home> ельз
                              MyApp.app            ьн
                                                 ят
                          ■

                                               ен
                               ■ MyApp     -м
                               ■ MainWindow.nib

                               ■ SomeImage.png

                          ■ Documents - добавления здесь!
                          ■ Library

                               ■ Caches
                               ■ Preferences


                    • Applications only read and write within their home directory
                    • Backed up by iTunes during sync (mostly)
суббота, 21 мая 2011 г.
File Paths in Your Application
              File Paths in Your Application
               // Basic directories

                          путь к документам
                NSString *homePath = NSHomeDirectory();
                // Basic directories NSTemporaryDirectory();
                NSString *tmpPath =
                NSString *homePath = NSHomeDirectory();
                // Documents directory
                NSString *tmpPath = NSTemporaryDirectory();
                NSArray *paths = NSSearchPathForDirectoriesInDomains
                                  (NSDocumentDirectory, NSUserDomainMask, YES);
                // Documents directory
                NSArray *paths = NSSearchPathForDirectoriesInDomains
                NSString *documentsPath = [paths objectAtIndex:0];
                                 (NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *documentsPath = [paths objectAtIndex:0];
                // <Application Home>/Documents/foo.plist
                NSString *fooPath =
                // <Application stringByAppendingPathComponent:@“foo.plist”];
                [documentsPath Home>/Documents/foo.plist
                NSString *fooPath =
                [documentsPath stringByAppendingPathComponent:@“foo.plist”];




   Tuesday, February 2, 2010                                                      1

   Tuesday, February 2, 2010                                                 16
суббота, 21 мая 2011 г.
SQLite!

                     • база в файле
                     • нет сервера
                     • простая реализация
                     • включена в iPhone

суббота, 21 мая 2011 г.
7 шагов
                     • находим файл базы
                     • подключаемся - sqlite3_open
                     • создаем запрос
                     • готовим, проверяем - sqlite3_prepare_v2
                     • выполняем - sqlite3_step
                     • завершаем - sqlite3_finalize
                     • закрываем - 	

 sqlite3_close
суббота, 21 мая 2011 г.
шаг 0 - создать БД
          $ sqlite3 ex1
          SQLite version 3.6.11
          Enter ".help" for instructions
          Enter SQL statements terminated with a ";"
          sqlite> create table tbl1(one varchar(10), two smallint);
          sqlite> insert into tbl1 values('hello!',10);
          sqlite> insert into tbl1 values('goodbye', 20);
          sqlite> select * from tbl1;
          hello!|10
          goodbye|20
          sqlite>
                                                      CREATE TABLE Person (
                                                       id integer unique not null,
                                                       first_name char(20),
                                                       last_name char(20),
                                                       address char(100),
                                                       email char(30),
                                                       telephone char(15),
                                                       birth_date int
                                                      );


суббота, 21 мая 2011 г.
подготовка
         #import <sqlite3.h>

   ! NSString *databaseName = @"Cocktails.sql";
   ! NSArray *documentPaths = NSSearchPathForDirectoriesInDomains
   (NSDocumentDirectory, NSUserDomainMask, YES);
   ! NSString *documentsDir = [documentPaths objectAtIndex:0];
   ! NSString *databasePath = [documentsDir
   stringByAppendingPathComponent:databaseName];
   ! BOOL success;

   ! NSFileManager *fileManager = [NSFileManager defaultManager];
   ! success = [fileManager fileExistsAtPath:databasePath];

   ! if(!success) {
      ! NSString *databasePathFromApp = [[[NSBundle mainBundle]
      resourcePath] stringByAppendingPathComponent:databaseName];
      ! [fileManager copyItemAtPath:databasePathFromApp
      toPath:databasePath error:nil];
      ! [fileManager release];
   ! }
   !
суббота, 21 мая 2011 г.
чтение
 sqlite3 *database;
 ! if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
 ! ! const char *sqlStatement = "select * from cocktail;";
 ! ! sqlite3_stmt *compiledStatement;

 ! ! if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement,
 NULL) == SQLITE_OK) {

 ! ! ! while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
 ! ! ! ! int anId = sqlite3_column_int(compiledStatement, 0);
 ! ! ! ! NSString *aName = [NSString stringWithUTF8String:(char *)
 sqlite3_column_text(compiledStatement, 1)];
            //...
 ! ! ! }
 ! ! }
 ! ! sqlite3_finalize(compiledStatement);
 ! }
 ! sqlite3_close(database);




суббота, 21 мая 2011 г.
запись


                     • просто sqlite3_step(compiledStatement),
                          при удаче - SQLITE_DONE




суббота, 21 мая 2011 г.
Сетевая активность приложения


             • GET/POST запросы
             • NSURLRequest и NSURLConnection
             • Защищенное соединение
             • Парсинг xml
             • Работа с публичными API

суббота, 21 мая 2011 г.
Google
         Maps API          Facebook API


                          Яндекс Карты
                              API



       Twitter API          общение с
                          вашим сервером


суббота, 21 мая 2011 г.
xml
  <?xml version="1.0" encoding="UTF-8" ?>
  <painting>
   <img src="madonna.jpg" alt='Foligno Madonna, by
  Raphael'/>
   <caption>This is Raphael's "Foligno" Madonna, painted in
    <date>1511</date>–<date>1512</date>.
   </caption>
  </painting>



суббота, 21 мая 2011 г.
xml
        ! NSURL *xmlURL = [NSURL URLWithString:URL];
        ! NSXMLParser * rssParser = [[NSXMLParser alloc]
        initWithContentsOfURL:xmlURL];
        ! [rssParser setDelegate:self];
        ! [rssParser parse];

        NSXMLParserDelegate:
        - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)
        parseError

        - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)
        elementName namespaceURI:(NSString *)namespaceURI qualifiedName:
        (NSString *)qName attributes:(NSDictionary *)attributeDict

        - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)
        elementName namespaceURI:(NSString *)namespaceURI qualifiedName:
        (NSString *)qName

        - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)
        string

        - (void)parserDidEndDocument:(NSXMLParser *)parser {

суббота, 21 мая 2011 г.
What does a JSON object look like?
                                            json
                  {
                       “instructor” : “Josh Shaffer”,
                       “students” : 60,
                       “itunes-u” : true,
                       “midterm-exam” : null,
                       “assignments” : [ “WhatATool”,
                                          “HelloPoly”,
                                          “Presence” ]
                  }



             • NSDictionary *result = [jsonString JSONValue];
y, February 2, 2010                                      41



 суббота, 21 мая 2011 г.
NSURLConnection
      NSString *strUrl = [NSString stringWithString:@"http://prognozempatika.appspot.com/
      prognoz?str=Hello, World!"];
      NSString *escapedString = [strUrl
      stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
      NSURL *url = [ NSURL URLWithString: @"http://www.yourwebsite.com/image.png" ];
      NSURLRequest *request = [ [ NSURLRequest alloc ] initWithURL: url
          cachePolicy: NSURLRequestReturnCacheDataElseLoad
          timeoutInterval: 60.0
      ];
      NSMutableData *data = [ [ NSMutableData data ] retain ];
      NSURLConnection * connection = [ [ NSURLConnection alloc ]
          initWithRequest: request delegate: self ];
      -(void)connection:(NSURLConnection *)connection didReceiveResponse:
          (NSURLResponse *)response
      {
          [ data setLength: 0 ];
      }

         -(void)connection:(NSURLConnection *)connection didReceiveData:
             (NSData *)incomingData
         {
             [ data appendData: incomingData ];
         }


                                         -(void)connectionDidFinishLoading:(NSURLConnection *)connection {
                                             NSLog(@"w00t! my image is finished loading!");
                                             NSString *string = [ [ NSString alloc ] initWithData: data encoding:NSUTF8StringEncoding ];
                                             [ data release ];
                                         }



суббота, 21 мая 2011 г.

Squeek school #6

  • 1.
    squeek school Разработка приложений для iOS суббота, 21 мая 2011 г.
  • 2.
    Хранение данных • Xml (plist) • SQLite суббота, 21 мая 2011 г.
  • 3.
    Хранение данных Property Lists • Property Lists - для небольшого объема • Writing an Array to Disk хранит обычные форматы данных iOS NSArray *array = [NSArray arrayWithObjects:@“Foo”, [NSNumber numberWithBool:YES], [NSDate dateWithTimeIntervalSinceNow:60], nil]; [array writeToFile:@“MyArray.plist” atomically:YES]; NSArray * a = [NSArray arrayWithContentsOfFile:xmlFile]; <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <array> <string>Foo</string> <true/> <date>2010-02-02T09:26:18Z</date> </array> </plist> суббота, 21 мая 2011 г.
  • 4.
    Хранение данных в настройках [[NSUserDefaults standardUserDefaults] setObject: ForKey:]; [[NSUserDefaults standardUserDefaults] objectForKey:]; [[NSUserDefaults standardUserDefaults] synchonize]; суббота, 21 мая 2011 г.
  • 5.
  • 6.
    а что внутри? Home Directory Layout • Each app has its own set of directories я! • <Application Home> ельз MyApp.app ьн ят ■ ен ■ MyApp -м ■ MainWindow.nib ■ SomeImage.png ■ Documents - добавления здесь! ■ Library ■ Caches ■ Preferences • Applications only read and write within their home directory • Backed up by iTunes during sync (mostly) суббота, 21 мая 2011 г.
  • 7.
    File Paths inYour Application File Paths in Your Application // Basic directories путь к документам NSString *homePath = NSHomeDirectory(); // Basic directories NSTemporaryDirectory(); NSString *tmpPath = NSString *homePath = NSHomeDirectory(); // Documents directory NSString *tmpPath = NSTemporaryDirectory(); NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); // Documents directory NSArray *paths = NSSearchPathForDirectoriesInDomains NSString *documentsPath = [paths objectAtIndex:0]; (NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; // <Application Home>/Documents/foo.plist NSString *fooPath = // <Application stringByAppendingPathComponent:@“foo.plist”]; [documentsPath Home>/Documents/foo.plist NSString *fooPath = [documentsPath stringByAppendingPathComponent:@“foo.plist”]; Tuesday, February 2, 2010 1 Tuesday, February 2, 2010 16 суббота, 21 мая 2011 г.
  • 8.
    SQLite! • база в файле • нет сервера • простая реализация • включена в iPhone суббота, 21 мая 2011 г.
  • 9.
    7 шагов • находим файл базы • подключаемся - sqlite3_open • создаем запрос • готовим, проверяем - sqlite3_prepare_v2 • выполняем - sqlite3_step • завершаем - sqlite3_finalize • закрываем - sqlite3_close суббота, 21 мая 2011 г.
  • 10.
    шаг 0 -создать БД $ sqlite3 ex1 SQLite version 3.6.11 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table tbl1(one varchar(10), two smallint); sqlite> insert into tbl1 values('hello!',10); sqlite> insert into tbl1 values('goodbye', 20); sqlite> select * from tbl1; hello!|10 goodbye|20 sqlite> CREATE TABLE Person (  id integer unique not null,  first_name char(20),  last_name char(20),  address char(100),  email char(30),  telephone char(15),  birth_date int ); суббота, 21 мая 2011 г.
  • 11.
    подготовка #import <sqlite3.h> ! NSString *databaseName = @"Cocktails.sql"; ! NSArray *documentPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); ! NSString *documentsDir = [documentPaths objectAtIndex:0]; ! NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; ! BOOL success; ! NSFileManager *fileManager = [NSFileManager defaultManager]; ! success = [fileManager fileExistsAtPath:databasePath]; ! if(!success) { ! NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; ! [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; ! [fileManager release]; ! } ! суббота, 21 мая 2011 г.
  • 12.
    чтение sqlite3 *database; ! if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { ! ! const char *sqlStatement = "select * from cocktail;"; ! ! sqlite3_stmt *compiledStatement; ! ! if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { ! ! ! while(sqlite3_step(compiledStatement) == SQLITE_ROW) { ! ! ! ! int anId = sqlite3_column_int(compiledStatement, 0); ! ! ! ! NSString *aName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(compiledStatement, 1)]; //... ! ! ! } ! ! } ! ! sqlite3_finalize(compiledStatement); ! } ! sqlite3_close(database); суббота, 21 мая 2011 г.
  • 13.
    запись • просто sqlite3_step(compiledStatement), при удаче - SQLITE_DONE суббота, 21 мая 2011 г.
  • 14.
    Сетевая активность приложения • GET/POST запросы • NSURLRequest и NSURLConnection • Защищенное соединение • Парсинг xml • Работа с публичными API суббота, 21 мая 2011 г.
  • 15.
    Google Maps API Facebook API Яндекс Карты API Twitter API общение с вашим сервером суббота, 21 мая 2011 г.
  • 16.
    xml <?xmlversion="1.0" encoding="UTF-8" ?> <painting> <img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/> <caption>This is Raphael's "Foligno" Madonna, painted in <date>1511</date>–<date>1512</date>. </caption> </painting> суббота, 21 мая 2011 г.
  • 17.
    xml ! NSURL *xmlURL = [NSURL URLWithString:URL]; ! NSXMLParser * rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; ! [rssParser setDelegate:self]; ! [rssParser parse]; NSXMLParserDelegate: - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *) parseError - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *) elementName namespaceURI:(NSString *)namespaceURI qualifiedName: (NSString *)qName attributes:(NSDictionary *)attributeDict - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *) elementName namespaceURI:(NSString *)namespaceURI qualifiedName: (NSString *)qName - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *) string - (void)parserDidEndDocument:(NSXMLParser *)parser { суббота, 21 мая 2011 г.
  • 18.
    What does aJSON object look like? json { “instructor” : “Josh Shaffer”, “students” : 60, “itunes-u” : true, “midterm-exam” : null, “assignments” : [ “WhatATool”, “HelloPoly”, “Presence” ] } • NSDictionary *result = [jsonString JSONValue]; y, February 2, 2010 41 суббота, 21 мая 2011 г.
  • 19.
    NSURLConnection NSString *strUrl = [NSString stringWithString:@"http://prognozempatika.appspot.com/ prognoz?str=Hello, World!"]; NSString *escapedString = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [ NSURL URLWithString: @"http://www.yourwebsite.com/image.png" ]; NSURLRequest *request = [ [ NSURLRequest alloc ] initWithURL: url cachePolicy: NSURLRequestReturnCacheDataElseLoad timeoutInterval: 60.0 ]; NSMutableData *data = [ [ NSMutableData data ] retain ]; NSURLConnection * connection = [ [ NSURLConnection alloc ] initWithRequest: request delegate: self ]; -(void)connection:(NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response { [ data setLength: 0 ]; } -(void)connection:(NSURLConnection *)connection didReceiveData: (NSData *)incomingData { [ data appendData: incomingData ]; } -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"w00t! my image is finished loading!"); NSString *string = [ [ NSString alloc ] initWithData: data encoding:NSUTF8StringEncoding ]; [ data release ]; } суббота, 21 мая 2011 г.