CloudKit I. (zatím ne zcela dořešené koncepty použití) Martin Hrubý Seminář ios, FIT VUT v Brně



Podobné dokumenty
Knihovna Foundation. Seminář ios Martin Hrubý, FIT VUT v Brně

ios Cvičení RSS čtečka

Vývoj SW pro mobilní zařízení s ios. Petr Hruška, Skymia s.r.o. Teorie a praxe IP telefonie,

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

8.2 Používání a tvorba databází

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Konstruktory a destruktory

Programování v C++ 3, 3. cvičení

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

20. Projekt Domácí mediotéka

Databázový systém Matylda

Zápisování dat do databáze

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

DUM 15 téma: Příkazy pro řízení přístupu

Databázové systémy I. 1. přednáška

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Tvorba informačních systémů

RMI - Distribuované objekty v Javě

Roční periodická zpráva projektu

PHP a Large Objecty v PostgreSQL

Replikace je proces kopírování a udržování databázových objektů, které tvoří distribuovaný databázový systém. Změny aplikované na jednu část jsou

Monitorování a audit databází v reálném čase. Ing. Jan Musil IBM Česká republika

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Komunikace eorders. aegis. aegis.cz. Konference Common 2009 Malá Fatra. Evžen Kučera

Více o konstruktorech a destruktorech

IRAE 07/08 Přednáška č. 1

Práva a role. Martin Polák. NDBI013 Administrace Oracle

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Jazyk C++ I. Šablony 2

Plánování a vývoj základního frameworku

Rezervační systém Tvorba WWW stránek

VYSOKÁ ŠKOLA BÁŇSKÁ TECHNICKÁ UNIVERZITA OSTRAVA FAKULTA STROJNÍ DATABÁZOVÉ SYSTÉMY ARCHITEKTURA DATABÁZOVÝCH SYSTÉMŮ. Ing. Lukáš OTTE, Ph.D.

Měřící systém se vzdáleným přístupem. Databáze

Použití databází na Webu

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

STARÁ DOBRÁ JAVA A PERSISTENCE S CACHÉ

Jazyk C# (seminář 6)

Úvod do databázových systémů

Manuál k aplikaci FieldGIS v.2.27

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Active Directory organizační jednotky, uživatelé a skupiny

ZAŘÍZENÍ PRO VZDÁLENÝ SBĚR A PŘENOS DAT FIRMWARE

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Verzování a publikace dat na webu za pomoci PostgreSQL

Audit DB. Referát. Vypracoval: Zdeněk Doležal MFF UK Praha 11/5/06

Patrol Management System 2.0

Outdoor Expert. Uživatelský manuál. Verze aplikace: OutdoorExpert_Manual.docx 1 /

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

Agenda. Docházka Návrat k minulému praktickému cvičení Zápočtové práce. Dokumentace. Dotazy, přání, stížnosti. Co, jak a proč dokumentovat

Mediator motivace. FontDialog. závislosti mezi jednotlivými ovládacími prvky jsou netriviální

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

SQL - trigger, Databázové modelování

KIV/PIA 2013 Jan Tichava

Komponentový návrh SW

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

Abstraktní datové typy

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Analýza Systém Správce

Coordinate System Editor Software

Databáze II. 1. přednáška. Helena Palovská

BankKlient. FAQs. verze 9.50

XAMARIN 10 PRAKTICKÝCH ZKUŠENOSTÍ. Roman Fischer

Střední odborná škola a Střední odborné učiliště, Hořovice

Dokumentový sklad. Dokumentový sklad v.1. Dokumentový sklad v.2. Koncepce skladu v.2. Petr Lampa

Databázové systémy Cvičení 5.2

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Microsoft Sync Framework. Jiří Činčura blog.cincura.net

MapleCloud a jeho použ ití. Vladimír Žák

APS Web Panel. Rozšiřující webový modul pro APS Administrator. Webové rozhraní pro vybrané funkce programového balíku APS Administrator

HP-2000E UŽIVATELSKÝ MANUÁL

Mobile application developent

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Transakce a zamykání. Administrace MS SQL Serveru (NDBI039) Pavel Hryzlík

Autor. Potřeba aplikací sdílet a udržovat informace o službách, uživatelích nebo jiných objektech

Mapa Česka:

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Databox CONTACT 6. Při konfiguraci systému řešíme jednoduchost, praktičnost, automatizaci a kontrolu.

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Vypracoval: Antonín Krumnikl Mob.: Tel.:

Aditivní služby k datovým schránkám, Poštovní datová zpráva

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Microsoft Windows Server System

MS WINDOWS II. Jádro. Správa objektů. Správa procesů. Zabezpečení. Správa paměti

MST - sběr dat pomocí mobilních terminálů on-line/off-line

Jak efektivně ochránit Informix?

1 Úvod. 2 Registrace a přihlášení. Registrace). Zobrazí se stránka, kde budete mít na výběr ze dvou možností. Můžete vytvořit nové či.

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Téma 5. Ovladače přístrojů Instrument Drivers (ID)

PREPROCESOR POKRAČOVÁNÍ

Administrace Oracle. Práva a role, audit

Softwarové komponenty a Internet

APS Administrator.ST

Funkční objekty v C++.

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Principy objektově orientovaného programování

Databáze 2011/2012 SQL DDL (CREATE/ALTER/DROP TABLE), DML (INSERT/UPDATE/DELETE) RNDr.David Hoksza, Ph.D.

Transkript:

CloudKit I. (zatím ne zcela dořešené koncepty použití) Martin Hrubý Seminář ios, FIT VUT v Brně

Úvod Představen na WWDC 2014 Základní popis funkcionality icloud DB Server kontejnery, entity, záznamy Uživatelé konkrétní aplikace mohou sdílet data jak jim to aplikace umožní Zařazen do IOS 8 Velmi specifická (až neobvyklá) koncepce Časem se uvidí, jak CK vývojáři pochopí a integrují do svých aplikací

Co CloudKit NENÍ Databázový server SQL typu Vybavovací doby jsou příliš velké Infrastrukuta CKRecord zřejmě nepředpokládá vetší přenosy dat v jednom balíku Přístupová práva všechno řídí aplikace Univerzální platforma pro mobilní aplikace (omezení zatím na ios/os X).

K čemu může být CK Informační systém pro malé skupiny uživatelů (firmy). Sociální síť. Zálohovací server pro uživatele (dat z jeho aplikace) Jak je privátní kontejner spojen s instalací aplikace?

Databáze v kontejneru Privátní z názvu plyne, že je individuální pro každého uživatele. Limitován velikostí icloud prostoru uživatele. Uživatel musí mít icloud přístup. Veřejný (public) zde mohou uživatelé sdílet záznamy. Masivní kvóta. Pro čtení netřeba icloud přístup. Pouze pro zápis. Kvóta roste s počtem zapojených uživatelů.

Zóny Další složka pro organizaci CKRecords: Kontejner -> Databáze -> Zóna Private DB Default + Custom zones Public DB Default Public DB neumožňuje vlastní zóny!!! Tady by se zrovna hodily. Nutno implementovat explicitním atributem záznamu.

Záznam (CKRecord) Má svůj typ (recordtype) NSString. typ by měl mít charakter DB Entity, tj. nějakou koncepci. Charakter NSDictionary s omezeným rozsahem typů pro value (key-value) protokol CKRecordValue. Záznam lze: save (insert, update), fetch (znám ID), query (neznám ID), delete. metadata datum vytvoření, uživatel.

Hodnoty atributů CKRecord setobject:forkey: NSString, NSDate, NSNumber, NSArray NSData ovšem maké kousky CLLocation geografická souřadnice WGS84 CKAsset souborová příloha CKReference vazba na jiný CKRecord (ve stejném kontejneru)

Instanciace CKRecord initwithrecordtype: initwithrecordtype: recordid: (CKRecordID *) RecordID je generováno rnd nebo uživatelské. Jak zacházet s CKRecord: Berme CKRecord jako dočasný objekt pro komunikaci s CK recordid jednoznačná identifikace záznamu. Lze ji uložit (.recordname) do lokálních dat aplikace a pak použít pro další operace (fetch, delete).

CK Databáze je objektová CKRecord je identifikován.recordid Vazby (reference) mezi CKRecords. Hodnota CKReference (typ vlastnictví) Vazby 1:N (NSArray s CKReference *) Nepřehánět to s provázaností mezi objekty. Atribut určující verzi DB modelu.

Smysl privátní databáze CKServerChangeToken udělá značku v private kontejneru nad stavem záznamů pak lze provádět rozdílové operace zjisti změny: obdrží seznam změn, ty lze zapracovat do stavu aplikace Vzdálené odkladiště záznamů jednoho uživatele Aplikace v kopiích na ios, OS X zařízeních může synchronizovat svá data s jejich vzdáleným uložením Lze určitě udělat jinak např. icloud Core Data

Ověření uživatelova přístupu Ubiquity token. Může se měnit. Sledovat v mainthread. NSFileManager* filemanager = [NSFileManager defaultmanager]; id currenticloudtoken = filemanager.ubiquityidentitytoken; [[NSNotificationCenter defaultcenter] addobserver: self selector: @selector (icloudaccountavailabilitychanged:) name: NSUbiquityIdentityDidChangeNotification object: nil];

Smysl public databáze Nelze dělat značky (ServerChangeToken) Nelze aktuálně odhadnout provoz/cvrkot, značky jsou nejspíš technicky nerealizovatelné. Navíc asi nelze smysluplně zformulovat smysl rozdílové operace ve více-uživatelském prostředí. Public DB berme jako nástěnku pro všechny uživatele jedné aplikace Berme CK-public jako perzistentní komunikační kanál. Lze rychle přesouvat CKRecs mezi databázemi?

Režimy nástěnky Přihlásit se jako observer změn v databázi, pak přijímat Push notifikace. Může být značný tok notifikací. Lze garantovat korektní zpracování všech notifikací? Model: chatovací aplikace broadcast události v CK. Občasný refresh stavu tabulek. Mazání záznamů. Ne-perzistence na straně čtenáře záznamu.

Můj doporučený koncept CK předpokládá nějakou formu lokální kopie dat, např. Core Data. Musíme spravovat DVĚ databáze: CK a CoreData. Lokální data => dává smysl aplikaci provozovat bez připojení k Internetu. V přechodu do online režimu provést formu synchronizace. V public je nutno definovat vlastníka záznamu. dle charakteru aplikace.

Původce a čtenář Původce vytvoří záznam. Je zodpovědný za jeho smazání z CK. Má zápisová práva. lokálně (CD) má atribut NSString pro ref. na CKRecord a Status objektu (exportován, modifikován, smazán). Synchronizace odeslání změn. Triviální. Čtenář synchronizace. Komplikovaná. Nepředpokládá se update záznamu. Query. Subscription na smazání.

Základní konstrukce V XCode Capabilities icloud jméno kontejneru icloud.eu.domena.appnazev V simulátoru může haprovat (přihlašte svůj AppleID) Inicializace CK API Vytvoření CKRecord Provádění dotazů/příkazů na CK

Inicializace API -(BOOL) initcloudkitwithcontainerid: (NSString *) containerid { self.ckcontainer = [CKContainer containerwithidentifier: containerid]; if (_ckcontainer == nil) return NO; self.ckdbprivate = [_ckcontainer privateclouddatabase]; self.ckdbpublic = [_ckcontainer publicclouddatabase]; } return YES;

Vytvoření CKRecord Instanciace objektu CKRecord Naplnění daty Provedení přístupové operace: Řada přístupových operací. Jsou to NSOperation! Sledování callback bloků a NSError

Operace nad daty Fetch záznamů rozdílová (Changes), normální. subscriptions. Modify záznamy, subscriptions. Query. User info specifické objekty o uživatelích. Notifikace fetch, mark.

Simple varianta CKRecord *rec = [[CKRecord alloc] initwithrecordtype: @"rectype1"]; [rec setobject: @"Pepa" forkey: @"name"]; [rec setobject: [NSDate date] forkey: @"narozen"]; [self.ckpublic saverecord: rec completionhandler:^(ckrecord *record, NSError *error) { NSLog(@"Saved %@", error); }];

Uživatelské RecordID CKRecordID *appdefid = [[CKRecordID alloc] initwithrecordname: @"Hlavnipolozka"]; CKRecord *appdef = [[CKRecord alloc] initwithrecordtype: @"Main" recordid:appdefid]; [appdef setobject: @"Martin" forkey: @ jmeno"]; [self.ckpublic saverecord: appdef completionhandler:^(ckrecord *record, NSError *error) { NSLog(@"Record AppDef, error: %@", error); }];

Komplexní varianta CKModifyRecordsOperation *op = [[CKModifyRecordsOperation alloc] initwithrecordstosave: @[rec] recordidstodelete: @[]]; op.completionblock = ^{ NSLog(@"Operace komplet dokoncena"); }; op.perrecordcompletionblock = ^(CKRecord *record, NSError *error) { NSLog(@"Zaznam proveden, chyba: %@", error); }; op.modifyrecordscompletionblock = ^( NSArray *savedrecords, NSArray *deletedrecordids, NSError *error) { NSLog(@"Completed uloz: %ld smaz: %ld", savedrecords.count, deletedrecordids.count); }; [self.ckpublic addoperation: op];

Query -(void) fetchrecords1 { // MUSI byt zadan NSPredicate *qpredicate = [NSPredicate predicatewithvalue: YES]; CKQuery *query = [[CKQuery alloc] initwithrecordtype: @"rectype1" predicate: qpredicate]; CKQueryOperation *op = [[CKQueryOperation alloc] initwithquery: query]; op.recordfetchedblock = ^(CKRecord *rec) { NSLog(@"Natazen objekt: %@", [rec objectforkey: @"name"]); }; op.querycompletionblock = ^(CKQueryCursor *cursor, NSError *operationerror){ self.ckcursor = cursor; }; } [self.ckpublic addoperation: op];

Query+cursor op.querycompletionblock = ^(CKQueryCursor *cursor, NSError *operationerror){ if (cursor!= nil) { }; } dispatch_async(dispatch_get_main_queue(), ^{ [self fetchrecords1c: cursor]; }); -(void) fetchrecords1c:(ckquerycursor *)withcursor { CKQueryOperation *op = [[CKQueryOperation alloc] initwithcursor: withcursor]; op.recordfetchedblock = ^(CKRecord *rec) { NSLog(@"Natazen objekt: %@", [rec objectforkey: @"name"]); }; } [self.ckpublic addoperation: op];

Vazby mezi objekty CKRecord *rec1 = [[CKRecord alloc] initwithrecordtype: @"rectype1"]; CKRecord *rec2 = [[CKRecord alloc] initwithrecordtype: @"rectype2"]; CKReference *rec2ref = [[CKReference alloc] initwithrecord: rec2 action: CKReferenceActionNone]; [rec1 setobject: @"Honza" forkey: @"name"]; [rec1 setobject: rec2ref forkey: @"studuje"]; [rec2 setobject: @"FIT" forkey: @"fakulta"]; [rec2 setobject: @"VUT" forkey: @"skola"]; CKModifyRecordsOperation *op = [[CKModifyRecordsOperation alloc] initwithrecordstosave: @[rec1, rec2] recordidstodelete: @[]]; [self.ckpublic addoperation: op];

Subscription CKSubscription perzistentní query na straně serveru. Posílá push-notifikace (povolení notifikací). Subscriptions: Globální pro aplikaci (zavedou se při prvním startu aplikace). Zaměřené na zadaný NSPredicate. Jsou to objekty (záznamy) v databázi! Hodilo by se je po upotřebení mazat. Začnou fungovat po zaindexovaní serverem.

[self.ckpublic savesubscription:dels completionhandler:^(cksubscription *subscription, NSError *error) { NSLog(@"Subscription zaveden: %@", error); if (error == nil) { NSUserDefaults *ud = [NSUserDefaults standarduserdefaults]; [ud setbool: NO forkey: FIRST_RUN]; [ud synchronize]; } }]; } Zavedení subs NSUserDefaults *ud = [NSUserDefaults standarduserdefaults]; [ud registerdefaults: @{ FIRST_RUN : @(YES)}]; if ([ud boolforkey: FIRST_RUN]) { [self registerdeletesubscr: @"rectype1"]; } -(void) registerdeletesubscr:(nsstring *)rectype { CKSubscription *dels = [[CKSubscription alloc] initwithrecordtype: rectype predicate: [NSPredicate predicatewithvalue: YES] options: CKSubscriptionOptionsFiresOnRecordDeletion];

Přijetí push-notifikace Aplikace je musí chtít přijímat. NotificationInfo.

Rozdílový Fetch Pouze v privátní DB, v custom zóně Vytvoření zóny Zjištění předchozího ChTokenu Provedení rozdílového Fetch Uložení nového ChTokenu

Vytvoření zóny CKRecordZone *zonepok = [[CKRecordZone alloc] initwithzonename: @"Pok"]; [self.ckprivate saverecordzone:zonepok completionhandler:^(ckrecordzone *zone, NSError *error) { NSLog(@"Save zone, error %@", error); }];

Předchozí token, UDefaults NSUserDefaults *ud = [NSUserDefaults standarduserdefaults]; NSData *dt = [ud dataforkey: @"changetoken"]; CKServerChangeToken *oldtoken = nil; if (dt!= nil) oldtoken = [NSKeyedUnarchiver unarchiveobjectwithdata: dt];

CKRecordZone *zone = [[CKRecordZone alloc] initwithzonename: @"Pok"]; CKFetchRecordChangesOperation *op = [[CKFetchRecordChangesOperation alloc] initwithrecordzoneid:[zone zoneid] previousserverchangetoken: oldtoken]; op.recordchangedblock = ^(CKRecord *rec) { NSLog(@"New/Modified object %@", rec); }; op.recordwithidwasdeletedblock = ^(CKRecordID *recid) { }; op.fetchrecordchangescompletionblock = ^(CKServerChangeToken *serverchangetoken, NSData *clientchangetokendata, NSError *operationerror) { if (operationerror == nil) { [ud setobject: [NSKeyedArchiver archiveddatawithrootobject: serverchangetoken] forkey: @"changetoken"]; [ud synchronize]; } else { NSLog(@"Error %@", operationerror); } }; [self.ckprivate addoperation: op];

CKCDManagedObject Bázová třída pro CK-CD entity. Režijní attr. Vytvoření CD objektu. Synchronizace: všechny nové a modifikované. všechny označené jako smazané. vytvoří se seznamy CKRecord

-(CKRecord *) ckcdcreateckrecord { CKRecord *rec = nil; if (self.ckcdrecordname == nil) { rec = [[CKRecord alloc] initwithrecordtype: [self ckcdentityname]]; } else { rec = [[CKRecord alloc] initwithrecordtype: [self ckcdentityname] recordid: [self ckcdgetckrecordid]]; } for (NSString *key in [self ckcdkeys]) { id objectatkey = [self valueforkey: key]; if ([objectatkey iskindofclass: [CKCDManagedObject class]]) { // je to reference CKCDManagedObject *ckcdreferencedobject = objectatkey; CKRecordID *refid = [[CKRecordID alloc] initwithrecordname: ckcdreferencedobject.ckcdrecordname]; CKReference *ref = [[CKReference alloc] initwithrecordid: refid action: CKReferenceActionNone]; [rec setobject: ref forkey: key]; } else [rec setobject: objectatkey forkey: key]; } } return rec;

Závěr I. dílu CK Private/Public DB Rozdílový fetch v private DB Práce v public DB Vždy se očekává lokální kopie dat Je třeba vytvořil robustní modely činnosti programu v různých režimech aplikací Implementace náhražky rozdílového fetch nad public DB