Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Android Databases (Español)
Search
Sloy
May 26, 2014
Technology
67
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Android Databases (Español)
Android Databases, alternativas de uso
Sloy
May 26, 2014
Other Decks in Technology
See All in Technology
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
5
640
安心して変更できるWebフロントエンドの作り方
pirosikick
5
2.7k
LLMに渡さなかった仕事
nanaism
0
540
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
2
550
開発投資の期待値を上げるプロダクトロードマップづくり ~プロダクトエンジニアが越境して事業を伸ばす~
kekekenta
1
200
おい、エージェントを使って終わらせろ
nwiizo
1
620
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
360
人間はどの意思決定を手放せるのか
kawasima
15
7.2k
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
9
4.4k
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
170
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
1
170
Goodbye ShellScript, Hello File-based App
shunsock
0
140
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
260
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Test your architecture with Archunit
thirion
2
2.4k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
660
Transcript
Android Databases +Rafael Vázquez
Android Databases Comparación | Alternativas
SQLite
SQLite Sencillo Ligero Embebido
None
API Nativa
API Nativa SQLiteOpenHelper 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); } @Override public 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); } @Override public 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); } @Override public 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); } @Override public 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); } @Override public 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 Nativa Simple (no sencilla) Documentación Control y rendimiento Más
código, más sucio Tendencia a errores Difícil de mantener
None
ORM Lite
ORM Lite Modelo Java OrmLiteSqliteOpenHelper DAO
Definir modelo (Contacto) @DatabaseTable public 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) @DatabaseTable public 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); } @Override public 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); } @Override public 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 Lite Fá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
None
Content Provider
Content Provider Tablas y columnas Almacenamiento independiente Entre aplicaciones
Ejemplo: Contacts Provider
Ejemplo: Contacts Provider
None
Ejemplo: Contacts Provider
Content Provider
Datos entre aplicaciones Permisos Integrado en Android Complejo Conocimientos avanzados
Sólo una capa Content Provider
None
¿Cuál elijo?
API Nativa Modelo impuesto Control total Rendimiento ORM Lite Objetos
Java Separar capas Urgente Content Provider Informació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