SQLite Android no puede abrir el archivo de base de datos

Edit: He intentado esto en mi teléfono y funciona, ¿alguien puede decirme por qué no funciona en un emulador?

Estoy tratando de abrir una base de datos en android, pero está lanzando un "archivo de base de datos no se pudo abrir" Excepción. En el depurador, parece que el error se produce en la línea mDb = mDbHelper.getWritableDatabase();

Mi código es el siguiente:

 package com.track.map; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBAdapter { protected static final String DATABASE_NAME = "data"; protected static final int DATABASE_VERSION = 1; //database tables //track table protected static final String TRACK_TABLE = "tracks"; protected static final String TRACK_ID = "_id"; protected static final String TRACK_DATE_TIME_START = "date_time_start"; protected static final String TRACK_DATE_TIME_END = "date_time_end"; //tables create protected static final String TRACK_TABLE_CREATE = "create table " + TRACK_TABLE + " (" + TRACK_ID + " integet promary key not null, " + TRACK_DATE_TIME_START + " text not null, " + TRACK_DATE_TIME_END + " text not null);"; protected DatabaseHelper mDbHelper; protected SQLiteDatabase mDb; protected final Context mContext; public DBAdapter(Context context) { mContext = context; } public DBAdapter open() throws android.database.SQLException { mDbHelper = new DatabaseHelper(mContext); mDb = mDbHelper.getWritableDatabase(); return this; } public void close() { mDb.close(); } protected static class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(TRACK_TABLE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { onCreate(db); //for now just recreate the database } } } 

y

 package com.track.map; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { private DBAdapter db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = new DBAdapter(this); db.open(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

Alguien sabe cual es el problema?

EDITAR:

El logcat es:

 03-24 11:43:42.022: I/Database(758): sqlite returned: error code = 14, msg = cannot open file at source line 25467 03-24 11:43:42.022: E/Database(758): sqlite3_open_v2("/data/data/com.track.map/databases/data", &handle, 6, NULL) failed 03-24 11:43:42.032: D/AndroidRuntime(758): Shutting down VM 03-24 11:43:42.032: W/dalvikvm(758): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 03-24 11:43:42.062: E/AndroidRuntime(758): FATAL EXCEPTION: main 03-24 11:43:42.062: E/AndroidRuntime(758): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.track.map/com.track.map.MainActivity}: android.database.sqlite.SQLiteException: unable to open database file 03-24 11:43:42.062: E/AndroidRuntime(758): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.os.Handler.dispatchMessage(Handler.java:99) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.os.Looper.loop(Looper.java:123) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.app.ActivityThread.main(ActivityThread.java:4627) 03-24 11:43:42.062: E/AndroidRuntime(758): at java.lang.reflect.Method.invokeNative(Native Method) 03-24 11:43:42.062: E/AndroidRuntime(758): at java.lang.reflect.Method.invoke(Method.java:521) 03-24 11:43:42.062: E/AndroidRuntime(758): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 03-24 11:43:42.062: E/AndroidRuntime(758): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 03-24 11:43:42.062: E/AndroidRuntime(758): at dalvik.system.NativeStart.main(Native Method) 03-24 11:43:42.062: E/AndroidRuntime(758): Caused by: android.database.sqlite.SQLiteException: unable to open database file 03-24 11:43:42.062: E/AndroidRuntime(758): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1812) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 03-24 11:43:42.062: E/AndroidRuntime(758): at com.track.map.DBAdapter.open(DBAdapter.java:37) 03-24 11:43:42.062: E/AndroidRuntime(758): at com.track.map.MainActivity.onCreate(MainActivity.java:17) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 03-24 11:43:42.062: E/AndroidRuntime(758): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 03-24 11:43:42.062: E/AndroidRuntime(758): ... 11 more 

Esto puede ser un poco tarde, pero espero que esto ayude para quien tiene este problema (ya que no puedo encontrar una solución definitiva alrededor).

Creo que sé la razón de esta causa (al menos para mi caso). Buscando en DDMS -> Explorador de archivos , se daría cuenta de que la carpeta de base de datos ( /data/data//databases/ ) no existe, por lo que la aplicación no puede crear el archivo de base de datos en esa carpeta inexistente. Si puede crear una carpeta de bases de datos de alguna manera, puede evitar este problema.

Debido a que soy perezoso, acabo de usar la carpeta /data/data//files/ cuando estoy en modo Emulator. Puede obtener los archivos dir usando esto:

 context.getFilesDir().getPath() 

Esto funcionó maravillosamente para mí en el emulador.

Espero que esto ayude a alguien.

En caso de que quiera ver algún código:

 String dbFilename = "example.db"; try { File databaseFile = getDatabasePath(dbFilename); SQLiteDatabase _db = SQLiteDatabase.openOrCreateDatabase(databaseFile); } catch (Exception e) { String databasePath = getFilesDir().getPath() + "/" + dbFilename; File databaseFile = new File(databasePath); _db = SQLiteDatabase.openOrCreateDatabase(databaseFile); } 

Editar:

Intenté iniciar sesión en Facebook (mi aplicación tiene integración con FB) en la carpeta Emulator y / databases apareció después de eso (y persistió). No estoy seguro de lo que pasó, pero es posible crear esa carpeta de alguna manera. Algo para otro experto por aquí para arrojar luz sobre.

Aunque no es relevante para su problema actual, el método onUpgrade en SQLiteOpenHelper también está destinado a fallar en el futuro: Si la acción que desea tomar cuando se implementa una nueva versión de la db es empezar de cero, tendrá que eliminar Las viejas tablas primero.

Editar Después de algunas investigaciones descubrí que su problema es bastante común:

Android SQLiteOpenHelper no puede abrir el archivo de base de datos

Los 3 enlaces proporcionados con esta respuesta

https://stackoverflow.com/a/8957994/2177061

Son particularmente interesantes y proporcionan algún tipo de solución, si no encuentra una manera limpia de hacer desaparecer el error.

Dicho esto, si estoy en ti, como un primer intento de resolver tu problema antes de profundizar con soluciones complejas, intentaría actualizar todas las herramientas de desarrollo de Android (el SDK en particular, pero actualizar el plugin de eclipse no dolerá), eliminar completamente Su aplicación desde el emulador y los dispositivos, y ejecútelo de nuevo.

¡Buena suerte!

Editar 2 No tenga en cuenta la siguiente observación (no es correcto, lo dejo aquí como referencia)

Tu código no funciona porque la consulta SQL es incorrecta: te deletreaste

 integet promary 

Donde debería haber sido

 integer primary 

(Además, me pasa a mí también que me vuelva loco con las clases de Android db sólo para encontrar que el problema reside en las consultas SQL :))

Espero que esto ayude

Prueba esto en tu constructor

 public youeConstructor(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); context.openOrCreateDatabase(DATABASE_NAME, context.MODE_PRIVATE, null); } 
 Why are you keeping code complex try this public SQLiteDatabase sampleDB; public String COLUMN_ID="_id"; public String COLUMN1="username"; public String COLUMN2="password"; public String TABLE_NAME="Androdata"; sampleDB = this.openOrCreateDatabase(TABLE_NAME, MODE_PRIVATE, null); private void insertDB() { sampleDB.execSQL("INSERT INTO " + TABLE_NAME + " Values ('1','Androviewer','viewer');"); System.out.println("Inserted data successfully...."); } private void createDB() { sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME+ "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN1 + " text not null,"+ COLUMN2 + " text not null);"); System.out.println("Database created successfully...."); } 

Yo estaba buscando una solución a este problema y no encontré nada que funcionó … pero afortunadamente hice algo que lo solucionó. Esto es lo que hice:

Abra su shell de anuncios y elimine la base de datos que está intentando abrir. Para aquellos que no saben cómo usar el terminal Linux:

// primer shell de adb abierto desde una línea de comandos

 adb shell 

// entonces estos son los comandos que necesitas (cambia YOUR.APP.PACKAGE por tu paquete de aplicación, debería parecer com.domain.apilcation)

 cd /data/data/YOUR.APP.PACKAGE/databases/ ls 

El último comando (ls) mostrará todas las bases de datos que creó para su proyecto y ahora puede quitar la base de datos que no puede abrir. En primer lugar, debe copiarlo, para que no pierda ningún dato importante. (Supongo que su base de datos se llama your_database.db)

 cp your_database.db your_database.db_backup rm your_database.db 

Entonces debes lanzar tu aplicación, debería crear una nueva base de datos y para mí esto solucionó el problema permanentemente.

¡Espero que esto ayude!

  • SQLiteConstraintException lanzada al intentar insertar
  • Sqlite no devuelve ninguna tabla, pero la tabla está presente cuando se obtiene en el dispositivo OnePlusTwo
  • No hay tal tabla android_metadata, ¿cuál es el problema?
  • Android SQLite Rendimiento con índices
  • Cómo convertir de java.util.HashMap a android.content.ContentValues?
  • Datos de exportación de Android a csv
  • Rendimiento de procesamiento de datos recursivo utilizando Java y SQLite
  • Java.lang.IllegalStateException: intento de volver a abrir un objeto ya cerrado (Tried closing)
  • Obteniendo un valor único de SQLite en android
  • Android - Observer DB cambia con GreenDao ORM
  • Android: No se puede realizar esta operación porque se ha cerrado el grupo de conexiones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.