Transcript

Android Databases

Android DatabasesComparación | Alternativas

SQLite

SQLiteSencillo

Ligero

Embebido

API Nativa

API NativaSQLiteOpenHelper

SQLiteDatabase

Cursor

Extender SQLiteOpenHelper

public static final String DATABASE_NAME = "contacts.db"; public static final int DATABASE_VERSION = 1; public static final String TABLE_CONTACTS = "contact"; public static final String FIELD_ID = "_id"; public static final String FIELD_NAME = "name"; public static final String FIELD_NUMBER = "number"; public SampleSQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Overridepublic void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_CONTACTS + "( " + FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + FIELD_NAME + " TEXT, " + FIELD_NUMBER + " NUMBER);"); }

1

Extender SQLiteOpenHelper

public static final String DATABASE_NAME = "contacts.db"; public static final int DATABASE_VERSION = 1; public static final String TABLE_CONTACTS = "contact";public static final String FIELD_ID = "_id";public static final String FIELD_NAME = "name";public static final String FIELD_NUMBER = "number";public SampleSQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION);} @Overridepublic void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_CONTACTS + "( " + FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + FIELD_NAME + " TEXT, " + FIELD_NUMBER + " NUMBER);");}

1

Extender SQLiteOpenHelper

public static final String DATABASE_NAME = "contacts.db";public static final int DATABASE_VERSION = 1;public static final String TABLE_CONTACTS = "contact"; public static final String FIELD_ID = "_id"; public static final String FIELD_NAME = "name"; public static final String FIELD_NUMBER = "number"; public SampleSQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION);} @Overridepublic void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_CONTACTS + "( " + FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + FIELD_NAME + " TEXT, " + FIELD_NUMBER + " NUMBER);");}

1

Extender SQLiteOpenHelper

public static final String DATABASE_NAME = "contacts.db";public static final int DATABASE_VERSION = 1;public static final String TABLE_CONTACTS = "contact";public static final String FIELD_ID = "_id";public static final String FIELD_NAME = "name";public static final String FIELD_NUMBER = "number";public SampleSQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Overridepublic void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_CONTACTS + "( " + FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + FIELD_NAME + " TEXT, " + FIELD_NUMBER + " NUMBER);");}

1

Extender SQLiteOpenHelper

public static final String DATABASE_NAME = "contacts.db";public static final int DATABASE_VERSION = 1;public static final String TABLE_CONTACTS = "contact";public static final String FIELD_ID = "_id";public static final String FIELD_NAME = "name";public static final String FIELD_NUMBER = "number";public SampleSQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION);} @Overridepublic void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_CONTACTS + "( " + FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + FIELD_NAME + " TEXT, " + FIELD_NUMBER + " NUMBER);"); }

1

Usar SQLiteDatabase (leer)

mDbHelper = new SampleSQLiteHelper(this); !SQLiteDatabase db = mDbHelper.getReadableDatabase(); String[] projection = {FIELD_ID, FIELD_NAME, FIELD_NUMBER}; String sortOrder = FIELD_NAME; Cursor cursor = db.query(TABLE_CONTACTS, projection, null, null, null, null, sortOrder); SimpleCursorAdapter adapter = new SimpleCursorAdapter( this, android.R.layout.simple_list_item_2, cursor, new String[]{FIELD_NAME, FIELD_NUMBER}, new int[]{android.R.id.text1, android.R.id.text2} ); setListAdapter(adapter); db.close();

2

Usar SQLiteDatabase (leer)

mDbHelper = new SampleSQLiteHelper(this); !SQLiteDatabase db = mDbHelper.getReadableDatabase(); String[] projection = {FIELD_ID, FIELD_NAME, FIELD_NUMBER};String sortOrder = FIELD_NAME; Cursor cursor = db.query(TABLE_CONTACTS, projection, null, null, null, null, sortOrder); SimpleCursorAdapter adapter = new SimpleCursorAdapter( this, android.R.layout.simple_list_item_2, cursor, new String[]{FIELD_NAME, FIELD_NUMBER}, new int[]{android.R.id.text1, android.R.id.text2}); setListAdapter(adapter);db.close();

2

Usar SQLiteDatabase (leer)

mDbHelper = new SampleSQLiteHelper(this); !SQLiteDatabase db = mDbHelper.getReadableDatabase(); String[] projection = {FIELD_ID, FIELD_NAME, FIELD_NUMBER}; String sortOrder = FIELD_NAME; Cursor cursor = db.query(TABLE_CONTACTS, projection, null, null, null, null, sortOrder); SimpleCursorAdapter adapter = new SimpleCursorAdapter( this, android.R.layout.simple_list_item_2, cursor, new String[]{FIELD_NAME, FIELD_NUMBER}, new int[]{android.R.id.text1, android.R.id.text2}); setListAdapter(adapter);db.close();

2

Usar SQLiteDatabase (leer)

mDbHelper = new SampleSQLiteHelper(this); !SQLiteDatabase db = mDbHelper.getReadableDatabase(); String[] projection = {FIELD_ID, FIELD_NAME, FIELD_NUMBER};String sortOrder = FIELD_NAME; Cursor cursor = db.query(TABLE_CONTACTS, projection, null, null, null, null, sortOrder); SimpleCursorAdapter adapter = new SimpleCursorAdapter( this, android.R.layout.simple_list_item_2, cursor, new String[]{FIELD_NAME, FIELD_NUMBER}, new int[]{android.R.id.text1, android.R.id.text2}); setListAdapter(adapter);db.close();

2

Usar SQLiteDatabase (leer)

mDbHelper = new SampleSQLiteHelper(this); !SQLiteDatabase db = mDbHelper.getReadableDatabase(); String[] projection = {FIELD_ID, FIELD_NAME, FIELD_NUMBER};String sortOrder = FIELD_NAME; Cursor cursor = db.query(TABLE_CONTACTS, projection, null, null, null, null, sortOrder); SimpleCursorAdapter adapter = new SimpleCursorAdapter( this, android.R.layout.simple_list_item_2, cursor, new String[]{FIELD_NAME, FIELD_NUMBER}, new int[]{android.R.id.text1, android.R.id.text2} ); setListAdapter(adapter); db.close();

2

Usar SQLiteDatabase (escribir)

SQLiteDatabase db = mDbHelper.getWritableDatabase(); ContentValues values = new ContentValues(2); values.put(FIELD_NAME, contactName); values.put(FIELD_NUMBER, contactNumber); db.insert(TABLE_CONTACTS, null, values); db.close();

3

Usar SQLiteDatabase (escribir)

SQLiteDatabase db = mDbHelper.getWritableDatabase(); ContentValues values = new ContentValues(2);values.put(FIELD_NAME, contactName);values.put(FIELD_NUMBER, contactNumber);db.insert(TABLE_CONTACTS, null, values);db.close();

3

Usar SQLiteDatabase (escribir)

SQLiteDatabase db = mDbHelper.getWritableDatabase();ContentValues values = new ContentValues(2); values.put(FIELD_NAME, contactName); values.put(FIELD_NUMBER, contactNumber); db.insert(TABLE_CONTACTS, null, values);db.close();

3

Usar SQLiteDatabase (escribir)

SQLiteDatabase db = mDbHelper.getWritableDatabase();ContentValues values = new ContentValues(2);values.put(FIELD_NAME, contactName);values.put(FIELD_NUMBER, contactNumber);db.insert(TABLE_CONTACTS, null, values); db.close();

3

API Nativa

API NativaSimple (no sencilla)

Documentación

Control y rendimiento

Más código, más sucio

Tendencia a errores

Difícil de mantener

ORM Lite

ORM LiteModelo Java

OrmLiteSqliteOpenHelper

DAO

Definir modelo (Contacto)

@DatabaseTablepublic class Contact { @DatabaseField(generatedId = true) private int id; @DatabaseField private String name; @DatabaseField(foreign = true, foreignAutoRefresh = true, foreignAutoCreate = true) private PhoneNumber phoneNumber; }

1

Definir modelo (Teléfono)

@DatabaseTablepublic class PhoneNumber { @DatabaseField(generatedId = true) private int id; @DatabaseField private int number; }

1

Extender OrmLiteSqliteOpenHelper

private static final int DB_VERSION = 1; private static final String DB_NAME = "contacts.db"; public DbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Overridepublic void onCreate(SQLiteDatabase db, ConnectionSource cs) { try { TableUtils.createTable(cs, Contact.class); TableUtils.createTable(cs, PhoneNumber.class); } catch (SQLException e) { throw new RuntimeException(e); } }

2

Extender OrmLiteSqliteOpenHelper

private static final int DB_VERSION = 1;private static final String DB_NAME = "contacts.db";public DbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION);} @Overridepublic void onCreate(SQLiteDatabase db, ConnectionSource cs) { try { TableUtils.createTable(cs, Contact.class); TableUtils.createTable(cs, PhoneNumber.class); } catch (SQLException e) { throw new RuntimeException(e); }}

2

private RuntimeExceptionDao<Contact, Integer> contactDao; private RuntimeExceptionDao<PhoneNumber, Integer> phoneDao; !!!public RuntimeExceptionDao<Contact, Integer> getDaoContact() { if (contactDao == null) { contactDao = getRuntimeExceptionDao(Contact.class); } return contactDao; } public RuntimeExceptionDao<PhoneNumber, Integer> getDaoPhone() { if (phoneDao == null) { phoneDao = getRuntimeExceptionDao(PhoneNumber.class); } return phoneDao; }

2 Extender OrmLiteSqliteOpenHelper (DAO)

private RuntimeExceptionDao<Contact, Integer> contactDao; private RuntimeExceptionDao<PhoneNumber, Integer> phoneDao; !!!public RuntimeExceptionDao<Contact, Integer> getDaoContact() { if (contactDao == null) { contactDao = getRuntimeExceptionDao(Contact.class); } return contactDao;} public RuntimeExceptionDao<PhoneNumber, Integer> getDaoPhone() { if (phoneDao == null) { phoneDao = getRuntimeExceptionDao(PhoneNumber.class); } return phoneDao;}

2 Extender OrmLiteSqliteOpenHelper (DAO)

private RuntimeExceptionDao<Contact, Integer> contactDao;private RuntimeExceptionDao<PhoneNumber, Integer> phoneDao; !!!public RuntimeExceptionDao<Contact, Integer> getDaoContact() { if (contactDao == null) { contactDao = getRuntimeExceptionDao(Contact.class); } return contactDao;} public RuntimeExceptionDao<PhoneNumber, Integer> getDaoPhone() { if (phoneDao == null) { phoneDao = getRuntimeExceptionDao(PhoneNumber.class); } return phoneDao;}

2 Extender OrmLiteSqliteOpenHelper (DAO)

mDbHelper = new SampleSQLiteHelper(this); !List<Contact> contacts = mDbHelper.getDaoContact().queryForAll(); setListAdapter(new ContactAdapter(this, contacts));

3 Usar DAOs (leer)

mDbHelper = new SampleSQLiteHelper(this); !List<Contact> contacts = mDbHelper.getDaoContact().queryForAll(); setListAdapter(new ContactAdapter(this, contacts));

3 Usar DAOs (leer)

mDbHelper = new SampleSQLiteHelper(this); !List<Contact> contacts = mDbHelper.getDaoContact().queryForAll(); setListAdapter(new ContactAdapter(this, contacts));

3 Usar DAOs (leer)

*

public class ContactAdapter extends BaseAdapter { // ... @Override public View getView(int position, View v, ViewGroup p) { v = inflater.inflate(android.R.layout.simple_list_item_2, p, false); Contact contact = getItem(position); TextView text1 = (TextView) v.findViewById(android.R.id.text1); TextView text2 = (TextView) v.findViewById(android.R.id.text2); text1.setText(contact.getName()); text2.setText(contact.getPhoneNumber().getNumber().toString()); return v; } }

* Extra: BaseAdapter

Contact contact = new Contact(); contact.setName(name); PhoneNumber phoneNumber = new PhoneNumber(); phoneNumber.setNumber(number); contact.setPhoneNumber(phoneNumber); mDbHelper.getDaoContact().create(contact);

3 Usar DAOs (escribir)

Contact contact = new Contact(); contact.setName(name); PhoneNumber phoneNumber = new PhoneNumber();phoneNumber.setNumber(number);contact.setPhoneNumber(phoneNumber);mDbHelper.getDaoContact().create(contact);

3 Usar DAOs (escribir)

Contact contact = new Contact();contact.setName(name);PhoneNumber phoneNumber = new PhoneNumber(); phoneNumber.setNumber(number); contact.setPhoneNumber(phoneNumber);mDbHelper.getDaoContact().create(contact);

3 Usar DAOs (escribir)

Contact contact = new Contact();contact.setName(name);PhoneNumber phoneNumber = new PhoneNumber();phoneNumber.setNumber(number);contact.setPhoneNumber(phoneNumber); mDbHelper.getDaoContact().create(contact);

3 Usar DAOs (escribir)

Contact contact = new Contact();contact.setName(name);PhoneNumber phoneNumber = new PhoneNumber();phoneNumber.setNumber(number);contact.setPhoneNumber(phoneNumber);mDbHelper.getDaoContact().create(contact);

3 Usar DAOs (escribir)

foreignAutoCreate = true

ORM Lite

ORM LiteFácil de usar

Generación automática

Transformación tabla-objeto

Modelos Java

Más allá de Android

No centrado en Android

No reaprovecha componentes

Content Provider

Content ProviderTablas y columnas Almacenamiento independiente Entre aplicaciones

Ejemplo: Contacts Provider

Ejemplo: Contacts Provider

Ejemplo: Contacts Provider

Content Provider

Datos entre aplicaciones Permisos Integrado en Android Complejo Conocimientos avanzados Sólo una capa

Content Provider

¿Cuál elijo?

API NativaModelo impuesto Control total Rendimiento ORM Lite

Objetos Java Separar capas Urgente

Content ProviderInformación compartida Extensible Integrar

Otras opciones

ADA Framework adaframework.com

Android Dataframework github.com/javipacheco/Android-DataFramework

greenDAO greendao-orm.com/

Sugar ORM satyan.github.io/sugar/

Retrofit (REST) github.com/square/retrofit

+Rafa Vázquez! sloydev.com

" @sloydev

top related