Skip to content

Commit e9142b1

Browse files
committed
Changed code indenting again and # titles
1 parent 3b717c1 commit e9142b1

File tree

1 file changed

+123
-123
lines changed

1 file changed

+123
-123
lines changed

_posts/2012-05-09-ormlite-pour-android.markdown

Lines changed: 123 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -13,37 +13,37 @@ Dans le cadre de mon étude des divers frameworks pour le développement java su
1313
</p>
1414

1515

16-
# L'utilisation d'ORMLite
16+
## L'utilisation d'ORMLite
1717

18-
## Annoter son modèle
18+
### Annoter son modèle
1919

2020
En Android natif, les objets de notre modèle sont de simples POJO tels que :
2121

2222
{% highlight java %}
2323
public final class User {
2424

25-
private int id;
26-
private String firstName;
27-
private String lastName;
28-
private String login;
29-
private String password;
25+
private int id;
26+
private String firstName;
27+
private String lastName;
28+
private String login;
29+
private String password;
3030

31-
public int getId() {
32-
return id;
33-
}
31+
public int getId() {
32+
return id;
33+
}
3434

35-
public void setId(int id) {
36-
this.id = id;
37-
}
35+
public void setId(int id) {
36+
this.id = id;
37+
}
3838

39-
public String getFirstName() {
40-
return firstName;
41-
}
39+
public String getFirstName() {
40+
return firstName;
41+
}
4242

43-
public void setFirstName(String firstName) {
44-
this.firstName = firstName;
45-
}
46-
...
43+
public void setFirstName(String firstName) {
44+
this.firstName = firstName;
45+
}
46+
...
4747
}
4848
{% endhighlight %}
4949

@@ -54,46 +54,46 @@ Nous allons utiliser les annotations d'ORMLite pour enrichir notre POJO :
5454
@DatabaseTable(daoClass = UserDaoImpl.class, tableName = User.TABLE_NAME)
5555
public final class User implements Serializable {
5656

57-
private static final long serialVersionUID = -3366808703621227882L;
58-
59-
public static final String TABLE_NAME = "users";
60-
61-
@DatabaseField(generatedId = true, columnName = Schema.ID)
62-
private long id;
63-
64-
@DatabaseField(columnName = Schema.FIRST_NAME)
65-
private String firstName;
66-
67-
@DatabaseField(columnName = Schema.LAST_NAME)
68-
private String lastName;
69-
70-
@DatabaseField(columnName = Schema.LOGIN)
71-
private String login;
72-
73-
@DatabaseField(columnName = Schema.PASSWORD)
74-
private String password;
75-
76-
public User(long id) {
77-
this.id = id;
78-
}
79-
80-
public long getId() {
81-
return id;
82-
}
83-
84-
public void setId(long id) {
85-
this.id = id;
86-
}
87-
88-
public String getFirstName() {
89-
return firstName;
90-
}
91-
92-
public void setFirstName(String firstName) {
93-
this.firstName = firstName;
94-
}
95-
96-
...
57+
private static final long serialVersionUID = -3366808703621227882L;
58+
59+
public static final String TABLE_NAME = "users";
60+
61+
@DatabaseField(generatedId = true, columnName = Schema.ID)
62+
private long id;
63+
64+
@DatabaseField(columnName = Schema.FIRST_NAME)
65+
private String firstName;
66+
67+
@DatabaseField(columnName = Schema.LAST_NAME)
68+
private String lastName;
69+
70+
@DatabaseField(columnName = Schema.LOGIN)
71+
private String login;
72+
73+
@DatabaseField(columnName = Schema.PASSWORD)
74+
private String password;
75+
76+
public User(long id) {
77+
this.id = id;
78+
}
79+
80+
public long getId() {
81+
return id;
82+
}
83+
84+
public void setId(long id) {
85+
this.id = id;
86+
}
87+
88+
public String getFirstName() {
89+
return firstName;
90+
}
91+
92+
public void setFirstName(String firstName) {
93+
this.firstName = firstName;
94+
}
95+
96+
...
9797
}
9898
{% endhighlight %}
9999

@@ -123,7 +123,7 @@ accountDao.refresh(user.getAccount());
123123
La gestion des relations entre objets est une des bases d'un ORM et c'est un vrai plus par rapport à de l'android natif.
124124

125125

126-
## Les DAO
126+
### Les DAO
127127

128128
ORMLite s'occupe du cycle de vie des DAO :
129129

@@ -142,37 +142,37 @@ Il est également possible (et conseillé) de définir ses propres DAO avec une
142142
{% highlight java %}
143143
// UserDao inteface that extends Dao
144144
public interface UserDao extends Dao<User, Integer> {
145-
ConnectionSource getConnectionSource();
146-
User findByLogin(String login);
145+
ConnectionSource getConnectionSource();
146+
User findByLogin(String login);
147147
}
148148

149149
// The UserDaoImpl must also extends BaseDaoImpl
150150
public class UserDaoImpl extends BaseDaoImpl<User, Integer> implements UserDao {
151151

152-
private ConnectionSource connectionSource;
153-
154-
public UserDaoImpl(ConnectionSource connectionSource, DatabaseTableConfig<User> tableConfig) throws SQLException {
155-
super(connectionSource, tableConfig);
156-
this.connectionSource = connectionSource;
157-
}
158-
159-
@Override
160-
public ConnectionSource getConnectionSource() {
161-
return connectionSource;
162-
}
163-
164-
@Override
165-
public User findByLogin(String login) {
166-
try {
167-
List<User> users = this.queryForEq(Schema.LOGIN, login);
168-
if(!users.isEmpty()) {
169-
return users.get(0);
170-
}
171-
} catch (SQLException e) {
172-
Log.e(C.LOG_TAG, "Error querying users for " + login + " login.", e);
173-
}
174-
return null;
175-
}
152+
private ConnectionSource connectionSource;
153+
154+
public UserDaoImpl(ConnectionSource connectionSource, DatabaseTableConfig<User> tableConfig) throws SQLException {
155+
super(connectionSource, tableConfig);
156+
this.connectionSource = connectionSource;
157+
}
158+
159+
@Override
160+
public ConnectionSource getConnectionSource() {
161+
return connectionSource;
162+
}
163+
164+
@Override
165+
public User findByLogin(String login) {
166+
try {
167+
List<User> users = this.queryForEq(Schema.LOGIN, login);
168+
if(!users.isEmpty()) {
169+
return users.get(0);
170+
}
171+
} catch (SQLException e) {
172+
Log.e(C.LOG_TAG, "Error querying users for " + login + " login.", e);
173+
}
174+
return null;
175+
}
176176
}
177177
{% endhighlight %}
178178

@@ -182,42 +182,42 @@ Un dernier petit détail : il est possible d'activer un cache au niveau des DAO
182182

183183
{% highlight java %}
184184
public HotelDao getHotelDao() {
185-
if (hotelDao == null) {
186-
try {
187-
hotelDao = getDao(Hotel.class);
188-
hotelDao.setObjectCache(true);
189-
} catch (Exception e) {
190-
Log.e(C.LOG_TAG, "unable to get hotel dao", e);
191-
}
192-
}
193-
return (HotelDao) hotelDao;
185+
if (hotelDao == null) {
186+
try {
187+
hotelDao = getDao(Hotel.class);
188+
hotelDao.setObjectCache(true);
189+
} catch (Exception e) {
190+
Log.e(C.LOG_TAG, "unable to get hotel dao", e);
191+
}
192+
}
193+
return (HotelDao) hotelDao;
194194
}
195195
{% endhighlight %}
196196

197-
## Les transactions
197+
### Les transactions
198198

199199
ORMLite fournit un mécanisme de transactions simple (voir la [doc](http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_5.html#SEC52)) :
200200

201201
{% highlight java %}
202202
final Hotel hotel = new Hotel();
203203
TransactionManager.callInTransaction(connectionSource,
204204
new Callable<Void>() {
205-
public Void call() throws Exception {
206-
// new hotel
207-
hotelDao.create(hotel);
208-
209-
// set the hotel to the booking
210-
booking.setHotel(hotel);
211-
212-
// update our booking
213-
bookingDao.update(booking);
214-
215-
return null;
216-
}
205+
public Void call() throws Exception {
206+
// new hotel
207+
hotelDao.create(hotel);
208+
209+
// set the hotel to the booking
210+
booking.setHotel(hotel);
211+
212+
// update our booking
213+
bookingDao.update(booking);
214+
215+
return null;
216+
}
217217
});
218218
{% endhighlight %}
219219

220-
## Le QueryBuilder
220+
### Le QueryBuilder
221221

222222
Le QueryBuilder a pour but de construire des requêtes SQL sans faire du SQL (ou presque). Il permet de chaîner les appels de méthodes afin de rendre plus lisible la requête :
223223

@@ -227,25 +227,25 @@ queryBuilder.where().eq(User.Schema.LOGIN, "demo").and().eq(User.Schema.PASSWORD
227227

228228
Pas besoin de s'étaler sur cette fonctionnalité qui n'est pas spécifique à Android. [La documentation](http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_3.html#SEC32) est d'ailleurs très complète à ce sujet.
229229

230-
# L'intégration à Android
230+
## L'intégration à Android
231231

232-
## Création et mise à jour de schémas
232+
### Création et mise à jour de schémas
233233

234234
ORMLite fournit un **OrmLiteSqliteOpenHelper** qui étend le SQLiteOpenHelper d'Android et qui permet de créer automatiquement le schéma SQLite et de le mettre à jour. Cette classe surcharge les onCreate et onUpgrade pour les besoins de SQLite. D'autres outils sont disponibles comme **TableUtils** qui permet de créer, vider et supprimer des tables.
235235

236-
## Accès aux DAO dans les activités
236+
### Accès aux DAO dans les activités
237237

238238
ORMLite fournit une classe qui surcharge Activity pour fournir à nos activités un accès direct à la couche de persistence : **OrmLiteBaseActivity**.
239239
Pour faire court, elle fournit un Helper qui nous permet de récupérer le OrmLiteSqliteOpenHelper du chapitre précédent. Ce helper est géré par la classe OpenHelperManager qui permet de gérer le cycle de vie du helper afin qu'une seule instance soit présente au sein de l'application.
240240

241241
{% highlight java %}
242242
// MyOrmLiteSqliteOpenHelper is our implementation of OrmLiteSqliteOpenHelper
243243
public class LoginActivity extends OrmLiteBaseActivity<MyOrmLiteSqliteOpenHelper> {
244-
245-
public void onCreate(Bundle savedInstanceState) {
246-
int userId = 42;
247-
User user = ((UserDao) getHelper().getDao(User.class)).queryForId((int) userId);
248-
}
244+
245+
public void onCreate(Bundle savedInstanceState) {
246+
int userId = 42;
247+
User user = ((UserDao) getHelper().getDao(User.class)).queryForId((int) userId);
248+
}
249249
}
250250
{% endhighlight %}
251251

@@ -258,9 +258,9 @@ OpenHelperManager.getHelper(context, MyOrmLiteSqliteOpenHelper.class);
258258
Par contre, il faudra bien prendre soin de libérer le helper afin de fermer la connection à la bdd (OpenHelperManager.release()).
259259

260260

261-
# Performances
261+
## Performances
262262

263-
## Les trucs à savoir
263+
### Les trucs à savoir
264264

265265
- Il peut y avoir un temps de chargement très long des DAO au démarrage de l'application. Afin de contrer ça, ORMLite fournit un utilitaire permettant de générer un fichier plat de description de votre schéma qui sera ensuite utilisé au démarrage de l'application pour charger les DAO au lieu d'utiliser la réflexion qui est extrêment coûteuse sur Android. Le fichier généré s'appelle ormlite_config.txt et sera stocké dans le répertoire res/raw/. Il faudra ensuite le référencer dans votre classe OrmLiteSqliteOpenHelper (pour de plus amples informations, voir [la doc d'ORMLite](http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_4.html#SEC41)).
266266

@@ -272,7 +272,7 @@ Par contre, il faudra bien prendre soin de libérer le helper afin de fermer la
272272

273273
Ceci permettra d'éviter à ORMLite la recherche de cette classe par réflexion (encore une fois).
274274

275-
## Benchmarks
275+
### Benchmarks
276276

277277
J'ai testé l'insertion de 1000 objets simples avec et sans transaction :
278278

@@ -288,12 +288,12 @@ Reste à comparer avec du Android natif :
288288

289289
Ces chiffres donnent juste un ordre d'idée car il faudrait beaucoup plus de tests pour avoir un benchmark plus précis, mais ils me confortent dans l'idée qu'ORMLite ne pénalise mon application en terme de performances.
290290

291-
## Le ressenti utilisateur
291+
### Le ressenti utilisateur
292292

293293
Comme écrit dans le chapitre précédent, je ne ressens aucune différence notable en terme d'utilisation de l'application.
294294

295295

296-
# Conclusion
296+
## Conclusion
297297

298298
ORMLite est donc un outil assez complet et assez léger (310 Ko) pour nos applications Android. Il nous permet d'écrire un code plus propre, plus lisible et plus léger. Il nous rapproche aussi de l'architecture utilisée dans nos développements Java côté serveur.
299299

0 commit comments

Comments
 (0)