LP DAM BDD Client IUT Informatique Université de Nice-Sophia Antipolis Macha DA COSTA - machada.fr - macha.dacosta@gmail.com
Résumé séances précédentes L architecture Client-Serveur Les applications Clientes App. Clientes Mobiles : connexion réseau stockage des données App. Clientes Web
Résumé séance 1 Architecture Client - Serveur
Résumé séance 2 CLIENTS RÉSEAU SERVEUR Architecture Client Mobile - Serveur
Résumé séance 2 OkHttp transfert HTTP personnalisé Retrofit transfert HTTP Glide transfert d image Android : connexion réseau HTTP
Résumé séance 2 (SCORE, 532) Moyens de stockage (USER, Mathias) Préférences partagés Shared Preferences Stockage interne Internal Storage Stockage externe External Storage BDD SQLite SQLite Databases Hack App Data (AGE, 23) HeartRate * id * value * date
Résumé séance 3 Cookies (qqles ko) Session Storage (plrs Mo) Local Storage (plrs Mo) Web SQL (WebKit, Opera) données structurées, tri IndexedDB (IE10, Chrome, Firefox) orientée JS, manipulation objets Application Cache Cache Storage
Résumé séance 3 Redux
Application Cliente Mobile
Plan A] App. Cliente Mobile : rappel B] Persistence des données structurées (Mobile) C] Communication
A] App. Cliente Mobile : rappel CLIENTS RÉSEAU SERVEUR
A] Caractéristiques des App. Clientes Mobiles Environnement ios Android Hybrid : Phone Gap, Titanium, Sencha Touch Windows Phone BlackBerry BDD Moyenne Traitement local Moyen Fréquence des échanges avec le serveur Modérée
A] App. Cliente Mobile : rappel (SCORE, 532) Moyens de stockage (USER, Mathias) Préférences partagés Shared Preferences Stockage interne Internal Storage Stockage externe External Storage BDD SQLite SQLite Databases Hack App Data (AGE, 23) HeartRate * id * value * date
A] App. Cliente Mobile : rappel SQLite syntaxe proche SQL + Java opération classique création de table insertion mise à jour recherche
B] Persistence des données structurées Librairie Realm Facile à utiliser Rapide Cross Platform Communauté importante Pinterest, GoPro, Google, SAP, Virgin, etc. Realm
B] Persistence des données structurées Librarie Realm VS SQLite Création d une instance pour manipuler la BDD Overture en écriture Fermeture Opérations classiques Realm creation de Table insertion/update recherche
B] Persistence des données structurées Librarie Realm VS SQLite Importation Création d une instance pour manipuler la BDD compile 'io.realm:realm-android:0.85.1' Realm realm = Realm.getInstance(this); SportBaseSQLite(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void oncreate(sqlitedatabase db) { db.execsql(database_create); }
B] Persistence des données structurées Librarie Realm VS SQLite Overture en écriture realm.begintransaction(); mdbhelper = new SportBaseSQLite(mCtx); mdb = mdbhelper.getwritabledatabase(); Fermeture //... add or update objects here... realm.committransaction(); realm.close(); if(mdbhelper!=null) mdbhelper.close();
B] Persistence des données structurées Librarie Realm VS SQLite private static final String TABLE_SS = "user"; private static final int NUM_COL_AGE = 1; private static final String COL_AGE = "age"; private static final int NUM_COL_NAME = 0; private static final String COL_NAME = "NAME"; Opérations classiques private static final String DATABASE_CREATE = "CREATE TABLE " + TABLE_SS + " (" + COL_NAME + " TEXT PRIMARY, " + COL_AGE + " INTEGER, ); creation /représentation Table public class User extends RealmObject { @PrimaryKey private String private int @Ignore private int name; age; sessionid; } // Standard getters & setters generated by your IDE public String getname() { return name; } public void setname(string name) { this.name = name; } public int getage() { return age; } public void setage(int age) { this.age = age; } public int getsessionid() { return sessionid; } public void setsessionid(int sessionid) { this.sessionid = session
B] Persistence des données structurées ContentValues initialvalues = new ContentValues(); initialvalues.put(col_name, ss.getname()); initialvalues.put(col_age, ss.getage()); Librarie Realm VS SQLite mdb.insert(table_ss, null, initialvalues); Opérations classiques insertion/update User user = realm.createobject(user.class); // Create a new object user.setname( John"); user.setage(12); user.setsession(271246252346352); realm.copytorealmorupdate(obj); realm.createorupdate(obj);
B] Persistence des données structurées public Cursor fetchallstatement() { return mdb.query(table_ss, new String[] {COL_NAME, COL_AGE, COL_SESSION,}, null, null, null, null, public List<User> getss(){ List<User> listss = new ArrayList<SportStatement>(); //Récupère dans un Cursor les valeur correspondant à un r Cursor c = fetchallstatement(); while(c.movetonext()){ listss.add(cursortoss(c)); } Librarie Realm VS SQLite //On ferme le cursor c.close(); return listss; } private User cursortoss(cursor c){ //si aucun élément n a été retourné dans la requête, on renvoie null if (c.getcount() == 0) Opérations classiques return null; User ss = new User(); //on lui affecte toutes les infos grâce aux infos contenues dans le Cursor recherche (requête) ss.setname(c.gettext(num_col_name)); ss.setage(c.getint(num_col_age)); return ss; } RealmResults<User> result = realm.where(user.class).equalto("name", "John").or().equalTo("name", "Peter").findAll();
B] Persistence des données structurées Realm 1. Spécifications type propriété 2. Requêtes conditions, opérateurs tri, calculs traitement résultats suppression
B] Persistence des données structurées 1. Specifications (Realm) Types des champs boolean short int long float double String Date byte[] Specifications (Realm) Propriétés des champs @Required @Ignore @Index non null non enregistré insertion lente donnée lourde recherche rapide @PrimaryKey String or Integer @Index
B] Persistence des données structurées 2. Requêtes (Realm) Conditions (dépends du type des champs) between, greaterthan(), lessthan(), greaterthanorequalto() & lessthanorequalto() equalto() & notequalto() contains(), beginswith() & endswith() Opérateurs logiques begingroup() = ( & endgroup() = ), AND in SQL or() Tri sort() Calculs sum(), max(), min(), average(), size()
B] Persistence des données structurées 2. Requêtes (Realm) Traitement résultats itération for (User u : result) { //... do something with the object... } Suppression realm.begintransaction(); // remove single match result.remove(0); result.removelast(); // remove a single object Dog dog = result.get(5); dog.removefromrealm(); // Delete all matches result.clear(); realm.committransaction()
B] Persistence des données structurées Realm Synchrone/Asynchrone 1. Lecture 2. Écriture
B] Persistence des données structurées 1. Lecture Requête Asynchrone/Synchrone dans Realm Asynchrone RealmResults<User> result = realm.where(user.class).findallasync(); if (result.isloaded()) { // Results are now available } Synchrone result.load() // FORCE : be careful, this will block the current thread until it returns RealmResults<User> result = realm.where(user.class).findall();
B] Persistence des données structurées 2. Ecriture Asynchrone/Synchrone dans Realm asynchrone RealmResults<User> result = realm.where(user.class).findallasync(); realm.executetransaction(new Realm.Transaction() { @Override public void execute(realm realm) { User user = realm.createobject(user.class); user.setname("john"); user.setemail("john@corporation.com"); } }); synchrone realm.begintransaction() realm.committransaction() realm.canceltransaction()
B] Persistence des données structurées Realm Best Practise
B] Persistence des données structurées Bonne Pratique Intégrer au cycle de vie d une Activity public class MyActivity extends Activity { private Realm realm; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); realm = Realm.getDefaultInstance(); } } @Override protected void ondestroy() { super.ondestroy(); realm.close(); }
B] Persistence des données structurées Bonne Pratique Intégrer au cycle de vie d un Fragment public class MyFragment extends Fragment { private Realm realm; @Override public void onstart() { super.onstart(); realm = Realm.getDefaultInstance(); } } @Override public void onstop() { super.onstop(); realm.close(); }
B] Persistence des données structurées Bonne Pratique Intégrer au cycle de vie d une Activity/Fragment public void onstop () { if (transaction!= null &&!transaction.iscancelled()) { transaction.cancel(); } }
C] Communication
C] Communication Réseau RTC HTTP/S via Wifi Cellulaire GSM Bluetooth NFC Autres : ondes sonores, infrarouge, Wiimax, MIMO etc.
C] Communication Niveau de sécurité Taille des données Porté/qualité du réseau Rapidité de transfert Cadre d utilisation
C] Communication HTTP/S via Wifi Niveau de sécurité token /session Taille /Type Données échangés Cellulaire Bluetooth pairage 9,75 m NFC 4 cm Propriétaires
TD n 4 Reprenez l app. du TD N 2 rendre les données persistantes à l aide de Realm