Bases de datos en
Android
LSUB, GYSC, URJC
Base de Datos
Relacional
• Permite guardar datos relacionados
• Preservando ACID
http://www.amazon.com/dp/0321197844/
SQL
• Lenguaje estándar (casi todas las
implementaciones tienen extensiones)
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?
csnumber=53681
• Para acceder y manipular bases de datos
relacionales
Álgebra relacional:
Relación
• Una base de datos guarda relaciones: ej. El nombre de
un empleado, su fecha de nacimiento, DNI, puesto, etc.
• Una relación es un conjunto de tuplas de atributos.
Los atributos son como variables (nombre, DNI…).
• Por ejemplo, (Juan Perez, 1998, 12323435J, C/ Luna)
es una tupla, Juan Perez, 1998, C/ Luna son valores
de los atributos de esa dupla.
• Las tuplas de valores son filas, los conjuntos del
elementos i de la tupla de valores son columnas
Teoría de conjuntos:
producto cartesiano
Teoría de conjuntos
Álgebra relacional:
operaciones
• Proyección (quedarme con algunas columnas): SELECT X, Y FROM AA
• Selección (quedarme con algunas filas): SELECT * FROM R WHERE XXX
• Producto Cartesiano: combinar relaciones (tamaño NxM, ojo)
SELECT * FROM R, S (producto cartesiano, CROSS JOIN)
- Producto Cartesiano + Selección XXX (JOIN, INNER JOIN)
SELECT * FROM R JOIN S ON XXX (si ON es una condición de
igualdad EQUIJOIN)
- NATURAL JOIN: join R con S la comparación de los conjuntos de atributos de
igual nombre en
SELECT * FROM R NATURAL JOIN S (es un tipo especial de
equijoin)
• Unión de conjuntos/Diferencia de conjuntos
Álgebra relacional:
operaciones
Álgebra relacional:
operaciones
θ-join: Producto cartesiano + proyección (inner join)
Join en una relación (coche vale más que barca)
Álgebra relacional:
operaciones
Join Natural: Equijoin en los comunes
Álgebra relacional:
operaciones, outer join
Outer Join, como un join pero,
las que no encajan las relleno,
left y right (abajo left outer join)
SELECT A FROM T1
LEFT JOIN T2
ON T1.DEPTNAME== T2.DEPTNAME
Álgebra relacional:
operaciones, outer join
Outer Join: right
SELECT A FROM T1
RIGHT JOIN T2
ON T1.DEPTNAME== T2.DEPTNAME
Claves
diferentes claves (ej: para cambiar un atributo)
• Para identificar unívocamente a una tupla: dos tuplas,
• Puede un atributo o varios
• Se puede asignar automáticamente (AUTOINCREMENT,
• Puede haber más de una clave, pero hay una esencial: clave
• Si un atributo es clave de otra tabla: foreign key, clave ajena
• Índices: traducen de clave a tupla, hay uno siempre, para la
clave primaria, puedo crear otros para ir más rápido (árbol B)
implícita)
primaria
Normalización
• Cuidado al definir las tablas
• Anomalías de actualización:
uno, datos repetidos…
- Ej: La clave son dos atributos, pero los datos dependen de
- Ej: Dos tablas, profesores y clases. En las clases el email del
profesor. Actualizar en dos sitios, quito la clase y pierdo el
email…
• Tres formas normales. Al final:
- Cualquier atributo (no clave) debe decir algo sobre la
clave, toda la clave y nada más que la clave
SQLite
• Implementación de SQL, más detalles:
http://it-ebooks.info/book/147/
es un fichero único.
• Android permite usar bases de datos SQLite de serie.
• No requiere administración. Una base de datos SQLite
• Permite almacenar datos: TEXT (como String de
Java), INTEGER (como long de Java), REAL (como
double de Java), BLOB binario (x’ac23ab’ de longitud
arbitraria)
SQLite
• “Dynamic typing”: cualquier tipo de datos
puede insertarse en cualquier columna
(¡aunque no coincida el tipo!). Ojo.
• Si queremos comprobación de violación de
claves ajenas (foreign keys), hay que activarlo:
PRAGMA foreign_keys = ON;
SQLite
índices, etc.).
• Una base de datos tiene un schema que la define (tablas,
• Toda base de datos tiene una tabla llamada
SQLITE_MASTER (sólo lectura) que representa el esquema
de la base de datos (se actualiza al cambiar el esquema). Sus
columnas son:
• type (TEXT): tabla o índice.
• name (TEXT): nombre.
• tbl_name (TEXT): nombre de la tabla para índices.
• rootpage (INTEGER): estructura de almacenamiento (b-tree).
• sql (TEXT): sentencia que creó la tabla o índice.
SQLite
• Ejemplo:
SQLite
CREATE TABLE Designations (
DesignationId INTEGER PRIMARY KEY AUTOINCREMENT,
Designation TEXT,
Description TEXT
);
SQLite
CREATE TABLE Departments (
DeptId INTEGER PRIMARY KEY AUTOINCREMENT,
DeptName TEXT,
Description TEXT
);
SQLite
CREATE TABLE Employees (
EmpId INTEGER PRIMARY KEY AUTOINCREMENT,
EmpCode INTEGER,
FirstName TEXT,
LastName TEXT,
Email TEXT,
DeptId INTEGER,
DesignationId INTEGER,
ManagerId INTEGER,
Address TEXT,
FOREIGN KEY(DeptId) REFERENCES Departments(DeptId),
FOREIGN KEY(DesignationId) REFERENCES Designations(DesignationId)
);
SQLite
También se puede volcar el esquema con el comando .schema
SQLite
INSERT INTO Departments (
DeptName,
Description
)
VALUES(
"IT",
"Technical staff"
);
INSERT INTO Departments (
DeptName,
Description
)
VALUES(
"Sales",
"Sales executives"
);
SQLite
INSERT INTO Designations (
Designation,
Description
)
VALUES(
"Programmer",
"C and Java developer"
);
SQLite
INSERT INTO Employees (
EmpCode,
FirstName,
LastName,
Email,
DeptId,
DesignationId,
ManagerId,
Address
)
VALUES (
554,
"John",
"Doe",
"
[email protected]",
1,
1,
32,
"Foo Rd. 12 D3"
);
SQLite
SELECT * FROM Departments;
SELECT * FROM Designations;
SELECT * FROM Employees;
SELECT FirstName, LastName, DesignationId
FROM Employees WHERE LastName == "Doe";
SQLite
SELECT Employees.FirstName,
Employees.LastName,
Designations.Description
FROM Employees NATURAL JOIN Designations
WHERE Employees.LastName == "Doe" ;
SELECT Employees.FirstName,
Employees.LastName,
Departments.DeptName
FROM Employees NATURAL JOIN Departments
WHERE Employees.LastName == "Doe" ;
SQLite
SELECT Employees.FirstName,
Employees.LastName,
Departments.DeptName,
Designations.Description
FROM Employees
INNER JOIN Designations ON Employees.DesignationId == Designations.DesignationId
INNER JOIN Departments ON Employees.DeptId == Departments.DeptId
WHERE Employees.LastName == "Doe" ;
SQLite
UPDATE Employees SET FirstName = "Manolo"
WHERE EmpId == 1;
SQLite
• DELETE: borra filas.
• DROP: borra tablas/índices.
• Más info:
http://www.sqlite.org/lang.html
SQLiteOpenHelper
• Heredando de esa clase podemos creamos
nuestra clase para acceder a la base de
datos.
• En el constructor, al llamar a super(), hay
que proporcionar el nombre de la base de
datos y la versión que queremos.
• Hay que cerrarlo después de usarlo.
SQLiteOpenHelper
public class DB extends SQLiteOpenHelper {
private final static String NAME = "company.db";
private final static int VERSION = 1;
public DB(Context context){
super(context, NAME, null, VERSION);
}
...
}
SQLiteOpenHelper
• Tendremos que redefinir los métodos:
• onCreate(): se invoca cuando se crea la base de
datos si no existe.
• onUpgrade(): se invoca cuando se invoca super()
con una nueva versión de la DB. Aquí debemos
hacer lo necesario para pasar de una versión a otra
(borrar tablas, crear tablas, etc.).
SQLiteOpenHelper
public final static String DESIGNATIONS = "Designations";
private final static String CREATE_DESIGNATIONS = "CREATE TABLE " + DESIGNATIONS + " (" +
" _id INTEGER PRIMARY KEY AUTOINCREMENT, " +
" Designation TEXT, " +
" Description TEXT);";
private final static String DESIGNATIONS = "Designations";
private final static String EMPLOYEES = "Employees";
// the two other CREATE SQL queries (CREATE_DEPARTMENTS and CREATE_EMPLOYEES) are excluded
...
@Override
public void onCreate(SQLiteDatabase database) {
Log.v(DB.class.getName(),"Creating DB.");
database.execSQL(CREATE_DESIGNATIONS);
database.execSQL(CREATE_DEPARTMENTS);
database.execSQL(CREATE_EMPLOYERS);
private void doReset(SQLiteDatabase database){
database.execSQL("DROP TABLE IF EXISTS " + DESIGNATIONS);
database.execSQL("DROP TABLE IF EXISTS " + DEPARTMENTS);
database.execSQL("DROP TABLE IF EXISTS " + EMPLOYEES);
onCreate(database);
}
}
}
@Override
public void onUpgrade(SQLiteDatabase database, int from, int to) {
Log.v(DB.class.getName(),"Upgrade DB, new version: " + to +
", deleting data");
doReset(database);
SQLiteOpenHelper
• De la clase helper podemos conseguir un
objeto SQLiteDatabase para acceder a los
datos:
• getReadableDatabase(): da acceso de sólo
• getWriteableDatabase(): da acceso de
lectura a la base de datos.
escritura.
SQLiteDatabase
• Esta clase representa una DB tiene
métodos para realizar queries SQL.
• Convenio en Android: la clave primaria de
• Hay que cerrarlo después de usarlo.
una tabla se debe llamar _id
SQLiteDatabase
• insert(), update(), delete(): métodos que facilitan este tipo de
peticiones.
public void insertDepartment(Department d) {
//myHelper is a DB reference (SQLiteOpenHelper)
SQLiteDatabase database = MyHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("DeptName", d.getDeptname());
values.put("Description", d.getDescription());
if(database.insert(DEPARTMENTS, null , val
Comentarios de: Bases de datos en Android (0)
No hay comentarios