Top Banner
Android Databases
58
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Android databases

Android Databases

Page 2: Android databases

Android DatabasesComparación | Alternativas

Page 3: Android databases

SQLite

Page 4: Android databases

SQLiteSencillo

Ligero

Embebido

Page 5: Android databases
Page 6: Android databases

API Nativa

Page 7: Android databases

API NativaSQLiteOpenHelper

SQLiteDatabase

Cursor

Page 8: Android databases

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

Page 9: Android databases

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

Page 10: Android databases

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

Page 11: Android databases

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

Page 12: Android databases

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

Page 13: Android databases

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

Page 14: Android databases

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

Page 15: Android databases

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

Page 16: Android databases

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

Page 17: Android databases

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

Page 18: Android databases

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

Page 19: Android databases

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

Page 20: Android databases

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

Page 21: Android databases

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

Page 22: Android databases

API Nativa

Page 23: Android databases

API NativaSimple (no sencilla)

Documentación

Control y rendimiento

Más código, más sucio

Tendencia a errores

Difícil de mantener

Page 24: Android databases
Page 25: Android databases

ORM Lite

Page 26: Android databases

ORM LiteModelo Java

OrmLiteSqliteOpenHelper

DAO

Page 27: Android databases

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

Page 28: Android databases

Definir modelo (Teléfono)

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

1

Page 29: Android databases

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

Page 30: Android databases

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

Page 31: Android databases

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)

Page 32: Android databases

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)

Page 33: Android databases

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)

Page 34: Android databases

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

3 Usar DAOs (leer)

Page 35: Android databases

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

3 Usar DAOs (leer)

Page 36: Android databases

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

3 Usar DAOs (leer)

*

Page 37: Android databases

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

Page 38: Android databases

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)

Page 39: Android databases

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)

Page 40: Android databases

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)

Page 41: Android databases

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)

Page 42: Android databases

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

Page 43: Android databases

ORM Lite

Page 44: Android databases

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

Page 45: Android databases
Page 46: Android databases

Content Provider

Page 47: Android databases

Content ProviderTablas y columnas Almacenamiento independiente Entre aplicaciones

Page 48: Android databases

Ejemplo: Contacts Provider

Page 49: Android databases

Ejemplo: Contacts Provider

Page 50: Android databases
Page 51: Android databases

Ejemplo: Contacts Provider

Page 52: Android databases

Content Provider

Page 53: Android databases

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

Content Provider

Page 54: Android databases
Page 55: Android databases

¿Cuál elijo?

Page 56: Android databases

API NativaModelo impuesto Control total Rendimiento ORM Lite

Objetos Java Separar capas Urgente

Content ProviderInformación compartida Extensible Integrar

Page 57: Android databases

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

Page 58: Android databases

+Rafa Vázquez! sloydev.com

" @sloydev