2011-01-26 50 views
12

Estoy buscando crear una base de datos sqlite en la tarjeta SD (no quiero utilizar el almacenamiento interno del usuario). Estoy familiarizado con el patrón OpenHelper:Base de datos SQLite en tarjeta SD

public DatabaseFoo(Context context) { 
    OpenHelper openHelper = new OpenHelper(context); 
    mDb = openHelper.getWritableDatabase(); 
} 

private static class OpenHelper extends SQLiteOpenHelper { 
    public OpenHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    ... 

por lo que si queremos crear en la tarjeta SD, creo que en lugar tenemos que utilizar:

public static SQLiteDatabase openOrCreateDatabase (String path, 
     SQLiteDatabase.CursorFactory factory); 

pero lo que es el argumento de "fábrica" se supone que es, ¿qué fábrica se debe utilizar?

también un poco preocupado por lo que ocurre si el usuario retira la tarjeta SD mientras mi aplicación está en uso ..

Gracias

Respuesta

9

no han tratado de hacer lo que usted describe allí, pero es de suponer que podría hacerse y podría funcionar, con algunas advertencias. En primer lugar, el almacenamiento externo (tarjeta SD) no es seguro, por lo que cualquier otra aplicación, o el usuario, podría leer/escribir en él. En segundo lugar, como ha notado, cuando se desmonta el DB desaparece.

Debido a estas desventajas, probablemente sería mejor que intente utilizar una base de datos de almacenamiento interna (la predeterminada), que es pequeña y posiblemente incluya punteros a datos externos (como imágenes o archivos), que pueden ser en el almacenamiento externo (y que tienen marcadores de posición, u otro manejo, cuando el almacenamiento externo no está disponible).

Sin embargo, si quieres probarlo, puede ser mejor reemplazar el método getDatabasePath de Context, tales como con su propio Application objeto, y luego pasar que en un habitual SQLiteOpenHelper. Entonces no tendría que preocuparse por la fábrica del cursor (que es opcional, as the source confirms - así que pase el nulo si en su lugar desea ir por esa ruta).

+0

El 'anulación getDatabasePath' de Aplicación o una costumbre ContextWrapper no funciona. Al leer el código fuente de Open Helper, noté que el método nunca se llama y, en su lugar, llama a 'mContext.openOrCreateDatabase', que crea el DB en el almacenamiento interno predeterminado. Por lo tanto, este método también debe ser anulado. –

+0

[aquí] (http://stackoverflow.com/questions/5332328/sqliteopenhelper-problem-with-fully-qualified-db-path-name/9168969#9168969) puede encontrar un ejemplo de trabajo de getDatabasePath sobrescrito y openOrCreateDatabase que funciona en Android 2.2. android 4.4 – k3b

2

La fábrica de cursores se utiliza para devolver una instancia de su implementación de Cursor personalizada. Generalmente solo usa SQLiteCursor, en cuyo caso nulo se pasa como argumento de fábrica.

1

Recomendaría no poner una base de datos en una tarjeta SD: disminuirá significativamente la vida útil de la tarjeta, ya que tiene un límite (grande, pero existente) en el número de escrituras posible y las bases de datos requieren bastantes escribe

+0

Hmm no sabía sobre el tema de la vida útil, es bueno saberlo. – user291701

+1

Hola Jeff, quiero saber algo más sobre esta limitación ¿puedes proporcionar algún enlace que describa mejor este problema? – Vignesh

+0

@Vignest: http://superuser.com/questions/17350/whats-the-life-expectancy-of-an-sd-card - Límites de escritura de tarjeta SD. Que las bases de datos usen muchas escrituras es simplemente un hecho de la tecnología. – Jeff

3

Luego haga su propia base de datos plana: la mayoría de las personas tiene muy poca memoria interna, y es molesto que se la coman con una enorme base de datos.

Y en cuanto al escenario '¿Qué pasa si eliminan la SD'? ¡Si el usuario retira la tarjeta, obviamente no va a funcionar! Claramente. Simplemente verifique que no haya cometido un error al tratar de interactuar con la base, y si lo hizo, solo le diga el usuario: problema resuelto.

9

hacer esto en su constructor SQLiteOpenHelper:

DatabaseHelper(Context context) { 
     super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION); 
    } 

Se va a crear la base de datos en la carpeta de la aplicación en la tarjeta sd:/sdcard/Android/data/[]/your_package_name archivos. De esa manera, la base de datos será vista como parte de la aplicación por Android y eliminada automáticamente si el usuario desinstala la aplicación.

Mi aplicación Tengo una gran base de datos que, en la mayoría de los casos, no cabe en la memoria interna de los teléfonos viejos, p. HTC Desire.Funciona muy bien en la tarjeta SD, y la mayoría de las aplicaciones se "mueven a sdcard" de todos modos, así que no se preocupe porque la base de datos no esté accesible, porque la aplicación no será accesible por sí misma.

1
public DataBaseHelper(final Context context) { 
    super(context, Environment.getExternalStorageDirectory() 
    + File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION); 
} 

también añadir el permiso de manifiesto androide

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
Cuestiones relacionadas