2011-08-14 17 views
33

En mi actividad me tienen, por ejemplo,¿Por qué usar SQLiteOpenHelper sobre SQLiteDatabase?

SQLiteDatabase db = openOrCreateDatabase(Preferences.DB_NAME, Context.MODE_PRIVATE, null); 
db.execSQL("CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value VARCHAR)"); 
Cursor dbResult = db.rawQuery("SELECT value FROM data", null); 
// do sometning with cursors 
dbResult.close(); 
db.close(); 

¿Cuál es la ventaja de utilizar SQLiteOpenHelper como

DatabaseHelper helper = new DatabaseHelper(this); 
SQLiteDatabase db = helper.getWriteableDatabase(); 
SQLiteDatabase db_2 = helper.getReadableDatabase(); 
Cursor dbResult = db_2.rawQuery("SELECT value FROM data", null); 
// do sometning with cursors 
dbResult.close(); 
helper.close(); 

clase en sí

public class DatabaseHelper extends SQLiteOpenHelper { 
    public DatabaseHelper(Context context) { 
     super(context, Preferences.DB_NAME, null, Preferences.DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String query = "CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value VARCHAR)"; 
     db.execSQL(query); 
     db.close(); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
} 

Respuesta

34

SQLiteDatabase

SQLiteDatabase tiene métodos para crear, eliminar, ejecutar comandos SQL, y realizar otras tareas comunes de administración de bases de datos.

SQLiteOpenHelper

una clase de ayuda a gestionar la creación de bases de datos y gestión de versiones.

Diré esto mucho, la actualización que viene con SQLiteOpenHelper viene MUY útil cuando actualiza su aplicación. Es principalmente para creación y actualización/gestión de versiones. SQLiteDatabase es principalmente para operaciones CRUD (puede crear con él, pero para eso es SQLiteOpenHelper).

+2

Lo que Jack dice es correcto. Tenga en cuenta que 'SQLiteOpenHelper' en realidad invoca los métodos estáticos de la clase' SQLiteDatabase'. – dnkoutso

12

SQLiteOpenHelper proporciona utilidades para simplificar las tareas de creación e inicialización de la base de datos si aún no está creada y convertir los contenidos de la base de datos cuando la aplicación se está actualizando y el esquema de la base de datos cambia.

Si tiene un esquema de base de datos muy simple, entonces realmente no le sirve de mucho, pero para cualquier cosa complicada es una ayuda definitiva. Se asegura de que todas las condiciones de borde fiddly estén cubiertas para que no tenga que hacerlo, como colocar transacciones en todos los lugares correctos para evitar daños en la base de datos.

+10

¿Puede explicar lo que quiere decir con ... "poner transacciones ...". Después de mirar el código fuente, no hay mucho trabajo adicional en la clase de ayuda. Comprueba la existencia, crea o abre la base de datos, verifica la versión y llama a Crear/actualizar. La construcción de transacciones en torno a sus estados de cuenta depende de usted si utiliza SQLiteOpenHelper. –

3

Por encima de otras respuestas, una característica muy importante en SQLiteOpenHelper clase, cuenta con 2 métodos sincronizados, getWritableDatabase() y getReadableDatabase().

Eso significa que las operaciones de su base de datos son thread safe.

fragmento de código SQLiteOpenHelper clase

public SQLiteDatabase getReadableDatabase() { 
    synchronized (this) { 
     return getDatabaseLocked(false); 
    } 
} 

y

public SQLiteDatabase getWritableDatabase() { 
    synchronized (this) { 
     return getDatabaseLocked(true); 
    } 
} 
0

Como está escrito en la referencia oficial de los desarrolladores

una clase de ayuda a gestionar la creación de bases de datos y gestión de versiones.

Se crea una subclase implementar onCreate (SQLiteDatabase), ONUPGRADE (SQLiteDatabase, int, int) y opcionalmente onOpen (SQLiteDatabase), y esta clase se encarga de abrir la base de datos si existe, crearla si lo hace no, y actualizándolo como necesario.Las transacciones se utilizan para garantizar que la base de datos siempre sea en un estado sensible.

Esta clase hace que sea fácil para las implementaciones ContentProvider diferir apertura y actualización de la base de datos hasta el primer uso, para evitar el bloqueo inicio de la aplicación con las actualizaciones de bases de datos de larga duración.

Para ver un ejemplo, vea la clase NotePadProvider en la aplicación de ejemplo NotePad , en el directorio samples/del SDK.

Así SQLiteOpenHelper hace las cosas bastante más fáciles.

Puede usar este enlace para aprender a manejar SQLite con SQLiteOpenHelper. SQLiteOpenHelper Tutorial.

Cuestiones relacionadas