¿Es realmente necesario crear tablas SQLite cada vez que se inicia la aplicación?

He notado en más de un tutorial de SQLite que la tabla es recreada en el evento onCreate() de la clase que extiende SQLiteOpenHelper . Ya he creado mi base de datos SQLite y tablas fuera del entorno de Android (Eclipse IDE) con la ayuda de un complemento de Firefox. Las tablas de la base de datos residen en el lugar esperado:

C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets

Me parece extraño que tendría que recrearlas programáticamente cada vez (obviamente, siguen existiendo y conservando datos, o cuál sería el punto)? Sin embargo, estoy teniendo un problema serio con esta aplicación ahora que me lleva a mi pregunta:

  • ¿Es realmente necesario recordar a Android cada vez sobre la base de datos?

Para mi disgusto, me di cuenta de que en lugar de crear mis tablas de base de datos en C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets , los había puesto en C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic\assets , que era un Versión anterior de la aplicación, sin embargo, copiar el archivo SQLite a la ubicación correcta no cambiar las cosas un solo bit. Si esto es lo que ha estado causando el problema, siendo que mi aplicación estaba buscando una base de datos AWOL, ¿no es suficiente simplemente copiar y pegar el archivo? ¿Debo hacer algo para presentar oficialmente la base de datos al directorio del system/Android/Eclipse ? ¿Alguna sugerencia?

En realidad SQLiteOpenHelper es responsable de la creación de su base de datos, actualización y muchos más. Si desea crear tablas programáticas, entonces tiene que escribir una consulta crear tablas en el método onCreate de la SQLiteOpenHelper SQLiteOpenHelper. Si desea actualizar su base de datos después de la base de datos previamente creada puede escribir las consultas de la tabla modificada en el método onUpgrade sólo Tienen que cambiar la versión de la base de datos.

Si ya ha creado una base de datos externamente y si desea utilizar esa base de datos, deberá colocarla en la carpeta de activos y copiarla en la carpeta de bases de datos que se encuentra en la carpeta /data/data/packagename/databases .

Aquí está el ejemplo para copiar la base de datos de los activos a la carpeta de bases de datos

 private static boolean copyDataBase(Context c) throws IOException { String DB_PATH = "/data/data/" + c.getPackageName() + "/databases/"; AssetManager mg = c.getResources().getAssets(); InputStream myInput = null; try { myInput = mg.open(DATABASE_NAME); } catch (IOException ex) { return false; } if (myInput != null) { String outFileName = DB_PATH + DATABASE_NAME; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[8000]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); Log.d(TAG, "Database is copied"); return true; } return false; } 

Aquí está el método que comprueba para las bases de datos y su versión para la copia

 public void copyDatabase() { try { SharedPreferences preferences = c.getSharedPreferences(c.getPackageName(), Context.MODE_PRIVATE); if (checkDataBase(c)) { if (preferences.getInt("dbversion", 0) != 0) { c.deleteDatabase(DatabaseHelper.DATABASE_NAME); } } getReadableDatabase(); close(); if (copyDataBase(c)) { Editor editor = preferences.edit(); editor.putInt("dbversion", DatabaseHelper.DATABASE_VERSION); editor.commit(); } } catch (Exception e) { e.printStackTrace(); } } 

Este es el ejemplo que verifica si la base de datos ya existe o no?

 public static boolean checkDataBase(Context c) { File f = new File("/data/data/" + c.getPackageName() + "/databases/" + DATABASE_NAME); if (!f.exists()) return false; SQLiteDatabase checkDB = null; try { checkDB = SQLiteDatabase .openDatabase("/data/data/" + c.getPackageName() + "/databases/" + DATABASE_NAME, null, SQLiteDatabase.OPEN_READONLY); checkDB.close(); } catch (SQLiteException e) { e.printStackTrace(); } return checkDB != null ? true : false; } 

Creo que usted está malentendido aquí. Cuando se construye un objeto SQLiteOpenHelper, comprobará si la base de datos SQLite existe o no, si no, llamará a su método onCreate () (donde normalmente los desarrolladores implementan SQL de creación de bases de datos)

Actualizar:
@Clay Shannon: Voy a explicar el mecanismo que Eclipse y Android proyecto de trabajo. Digamos que utilice Eclipse para programar el proyecto de Android. El nuevo proyecto creará una carpeta de proyecto en el espacio de trabajo (en su caso es C: \ aXX3 & Space \ Android \ workspace y la carpeta del proyecto es OnDemandAndAutomatic_Project ). Esta carpeta contiene varias subcarpetas, como: src, bin, assets, res, … Cada carpeta tiene su propio rol, y estás interesado en la carpeta assets, ¿no? La carpeta de activos se utiliza para contener archivos de referencia (que no puede o no desea poner en la carpeta res), tales como: archivo html, archivo de sonido, archivo de imágenes, archivo de texto … Cuando Eclipse construye el apk del proyecto, Estos archivos también se incluyen en el apk. Cuando se instala el apk en el dispositivo Android, el apk se copia en la carpeta del sistema Android, y también se crea una carpeta para contener datos de la aplicación, como se mencionó en Dharmendra: / data / data / {packagename} / (nombre_paquete como com.google. App, etc, y esta ruta es para tu sistema operativo Android de tu dispositivo, no para Windows).

Su caso aquí es que desea utilizar su base de datos ya existe, por lo que debe implementar una función que compruebe si su base de datos existe o no, si no copiar su base de datos en la base de datos de ruta de acceso / data / data / {packagename} / databases / , Y llame a esa función cuando empiece la aplicación. Y cómo hacerlo ya se ha contestado aquí Cómo copiar la base de datos existente de una aplicación a otra . También aquí es una referencia a los archivos de activos de acceso, en caso de que no saben http://www.wiseandroid.com/post/2010/06/14/Android-Beginners-Intro-to-Resources-and-Assets.aspx

Espero que ahora puedas resolver tu problema. Nota : su db ya existente debe ser una base de datos SQLite, o la aplicación no la reconocerá incluso si copia a la ruta correcta.

El SQLiteOpenHelper tiene su onCreate() llamado si la base de datos no existe. Tiene el onUpgrade() llamado si el esquema de la base de datos ha cambiado y necesita ser actualizado. Por lo tanto, la respuesta a su pregunta es: no .

  • ¿Por qué no puedo usar Resources.getSystem () sin un error de tiempo de ejecución?
  • SQLiteOpenHelper sincronización
  • Por qué necesitamos onUpgrade (); Método en la clase SQLiteOpenHelper
  • Android obtener la imagen de disco de base de datos es malformado (código 11) error
  • Intentando probar SQLiteOpenHelper pero getWritableDatabase () lanza Null
  • Intenta reabrir un objeto ya cerrado: sqlitequery
  • SQLiteOpenHelper "onCreate" no se llama? (El DB no existe)
  • Excepción fatal: error desconocido (código 14) no se pudo abrir la base de datos
  • Cómo funciona SQLiteOpenHelper Context
  • Abra / cierre correctamente una base de datos con el patrón de diseño Singleton
  • Uso de una base de datos SQLite en Libgdx
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.