green dao

34
greenDAO A look behind the scenes Droidcon Berlin 2012, Markus Junginger

Upload: droidcon-berlin

Post on 19-May-2015

22.467 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Green dao

greenDAO

A look behind the scenes

Droidcon Berlin 2012, Markus Junginger

Page 2: Green dao

About me, Follow me

Android developer since 2007

Founder of greenrobot.de, Munich

@green_dao Most updates

@greenrobot_de

Most important updates

+Markus Junginger

+greenrobot

Page 3: Green dao

Agenda

What is greenDAO?

– SQLite database

– ORM

– Code generation based on meta model

Background info and „secret“ internals

– Why code generation?

– Performance Tweaks

Page 4: Green dao

Problem with DB Development

Database world || Java world

No object orientation

Data access feels quite low levely

A lot of boilerplate code for SQLite

– SQL scripts, e.g.: CREATE TABLE, Queries

– Cursor iterations

– Parameter binding

Page 5: Green dao

Common solution: ORM

ORM offers a higher level API

– Read and write objects

– CREATE TABLE done for you

– Expressing Queries

SQLite

Database

Java Object

Java Object

Java Object greenDAO

Page 6: Green dao

Example: SQLite vs. greenDAO

String[] columns = { "note", "date_changed" };

String[] idArgs = { String.valueOf(id) };

SQLiteCursor cursor = (SQLiteCursor) db.query("notes", columns,

"_id=?", idArgs, null, null, "note");

try {

if (cursor.getCount() != 1) {

throw new Exception("Unexpected count: " +cursor.getCount());

}

cursor.moveToNext();

String note = cursor.getString(0);

String date = cursor.getString(1);

updateUi(note, date);

} finally {

cursor.close();

}

// greenDAO

Note note = noteDao.load(id);

updateUi(note.getNote(), note.getDate());

Page 7: Green dao

greenDAO Overview

Entities & DAOs

Code generation

Open Source:

https://github.com/greenrobot/greenDAO

Apache 2 license: core library

(embedded in your app)

GPL3: generator

(you usually don‘t have changes here)

Page 8: Green dao

greenDAO Structure

Generator Project (Plain Java)

Schema-Model • Entities • Properties • Relations • Indexes, …

greenDAO Generator Lib +FreeMarker

Android Project

Sources

greenDAO Core Lib

Generated Sources • Entities • DAOs

greenDAO Code Generation

Page 9: Green dao

Code Generation: Meta Model

In generator project

Defines data model

(your schema)

Define with Java

Page 10: Green dao

Example: Model for Generator

Schema schema = new Schema(1,

"de.greenrobot.daoexample");

Entity simple = schema.addEntity("Note");

simple.addIdProperty();

simple.addStringProperty("text").notNull();

simple.addDateProperty("date");

new DaoGenerator().generateAll(

"../DaoExample/src-gen", schema);

Page 11: Green dao

Example: Generated Entity

public class Note {

private String text;

// ID, date and constructors skipped

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

}

Page 12: Green dao

Code: Insert, Update, Delete

Note note = new Note();

note.setText(“Say hello to world”);

noteDao.insert(note);

Log.d("Dao", “New ID: " + note.getId());

note.setText(“Save the world”);

noteDao.update(note);

noteDao.delete(note);

Page 13: Green dao

QueryBuilder

References generated Properties

Java Complier checks

Example: Get all users with first name

“Joe“, and sort by last name List<User> joes = userDao.queryBuilder()

.where(Properties.FirstName.eq("Joe"))

.orderAsc(Properties.LastName)

.list();

Page 14: Green dao

Entity relations

Entity type relates to another entity type

Supports to-one and to-many relations

Unidirectional

Bidirectional: requires manual updates

Page 15: Green dao

ToOne Example

Entities Customer & Order

An order has one customer

Modelling in the generator project Property customerId = order.addLongProperty(

"customerId").notNull().getProperty();

order.addToOne(customer, customerId);

Resolving in the app Customer customer = order.getCostumer();

Page 16: Green dao

ToMany Example

Entities Customer & Order

A customer places many orders

Modelling in the generator project Property customerId = order.addLongProperty(

"customerId").notNull().getProperty();

customer.addToMany(order, customerId);

Resolving in the app List<Order> orders = costumer.getOrderList();

Page 17: Green dao

Active Entities

Have (some) persistence methods

– update

– delete

– refresh

Page 18: Green dao

greenDAO Design Goals

Maximum Performance

Low resource usage

– Memory consumption

– Library size

Easy-to-use API

Focus on the essentials

Optimized for Android

Page 19: Green dao

Save size, keep it the DRY way

Generate code, but as sparly as possible

Example: load method of DAO

AbstractDao class (core library)

– Implements everything expect readEntity

Generated DAO implements readEntity

– Just construct entities from a cursor position

Library size: 59 KByte + some K per DAO

Page 20: Green dao

3 Basic Performance Rules

1. Group DB changes into a transaction!

Can be like 500 times faster; still a FAQ

2. Don’t forget database indexes

3. Use prepared statements (precompiled)

Page 21: Green dao

Regular Performance Tracking

Different scenarios are tested

Tracked in Excel files

Excel files are pushed to github

Page 22: Green dao

Why Code Generation?

Annotation-based solutions: common with

JEE ORMs (Hibernate, JPA)

Parsing of annotations start-up time

Android & annotations:

getting/setting values requires reflection

Reflection quite slow on Android (n. slide)

Code generation to avoid reflection

Page 23: Green dao

Reflection Performance

Method Reflection (roughly)

getInt ~ 50 x slower

getString ~ 50 x slower

setInt ~ 400 x slower

setString ~ 150 x slower

Example: 100,000 Operations

(e.g. 10,000 entities with 10 properties)

setInt: 9 ms, reflected 3875ms

Page 24: Green dao

Profiling to find hotspots

Use traceview

Enable in code: Debug.

startMethodTracing(

traceName);

See class

PerformanceTest

Page 25: Green dao

Reading entities & Constructor

Entities read from the database

Solution 1: Calling setters MyEntity myEntity = new MyEntity();

myEntity.setX(cursor.getString(0));

Solution 2: Constructor only MyEntity myEntity = new MyEntity(

cursor.getString(0), …);

Performance gain: 33%

Page 26: Green dao

Optimization Candidate: Cursor

Quite some time is spent in Android API android.database.AbstractWindowedCursor

get… Methods are “slow”

@Override

public short getShort(int columnIndex) {

checkPosition();

return mWindow.getShort(mPos, columnIndex);

}

@Override

public int getInt(int columnIndex) {

checkPosition();

return mWindow.getInt(mPos, columnIndex);

}

Page 27: Green dao

Custom Cursor implementation

Replacing SQLiteCursor

de.greenrobot.dao.FastCursor

Performance gain: ~30%

Page 28: Green dao

Lookup by ID

Identity Scope (≈ Entity Caching)

Mapping ID Entity

HashMap<Long, MyEntity>

Problem: Long object creation

LongSparseArray<MyEntity>

Problem: does not scale

Evaluated several alternatives

Page 29: Green dao

LongHashMap & More

Custom de.greenrobot.dao.LongHashMap

+ Locking improvements

+ Minor performance tweaks

Performance gain: from 30% up to 117%

Page 30: Green dao

Performance: Entities / Second

Measured on a Nexus S (1 GHz), Android 2.3

Page 31: Green dao

Performance comparison

Measured on a Nexus S (1 GHz), Android 2.3

Page 32: Green dao

Current Workflow vs. Migration

Works best if you start from scratch

(Start with Entity modeling)

Migration: additional effort required

– Pre-existing entities: have to be replaced

– Existing tables: entities have to modeled

Ideas how to address migration

– Generic DAO (Annotation based entities!)

– Import existing Model from SQLite DB files

Page 33: Green dao

Current Feature Requests

Generate Adapters, CRUD Apps,

Parceable, conversion to JSON/XML, …

Convenience support for async ops

Client/Server(Cloud) data synchronization

More flexible primary keys (PKs)

Pre- and post persist callbacks

What is most important to you?

Page 34: Green dao

Disclaimer, Rechtliches

Alle Inhalte urheberrechtlich geschützt.

© Copyright 2011 Markus Junginger

All rights reserved.

Kontakt: [email protected]

http://greenrobot.de

http://twitter.com/#!/greenrobot_de