Android databases
-
Upload
rafael-vazquez-sanchez -
Category
Mobile
-
view
274 -
download
5
description
Transcript of Android databases
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