Hola.
Recibo el siguiente error al volcar los datos de un fichero llamado instalacionesdep.db. Lo curioso es, que se carga todo correctamente, pero en el logcat recibo el siguiente error.
12-11 13:05:54.284: E/SqliteDatabaseCpp(17232): sqlite3_open_v2("data/data/com.mipaquete.instalacionesdep/databases/instalacionesdep.db", &handle, 1, NULL) failed
12-11 13:05:54.354: E/SQLiteDatabase(17232): Failed to open the database. closing it.
12-11 13:05:54.354: E/SQLiteDatabase(17232): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at com.mipaquete.instalacionesdep.db.DataBaseHelper.checkDataBase(DataBaseHelper.java:99)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at com.mipaquete.instalacionesdep.db.DataBaseHelper.createDataBase(DataBaseHelper.java:72)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at com.mipaquete.instalacionesdep.db.TodasLasInstalacionesActivity.onClick(TodasLasInstalacionesActivity.java:71)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.view.View.performClick(View.java:3511)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.view.View$PerformClick.run(View.java:14105)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.os.Handler.handleCallback(Handler.java:605)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.os.Handler.dispatchMessage(Handler.java:92)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.os.Looper.loop(Looper.java:137)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.app.ActivityThread.main(ActivityThread.java:4424)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at java.lang.reflect.Method.invokeNative(Native Method)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at java.lang.reflect.Method.invoke(Method.java:511)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-11 13:05:54.354: E/SQLiteDatabase(17232): at dalvik.system.NativeStart.main(Native Method)
Parece que debo de cerrar en algún momento el myDbhelper, pero yo creo que realizo todos los pasos y no encuentro el fallo. Este es el código resumido de mi clase DataBaseHelper que extiende de SQLiteOpenHelper.
public class DataBaseHelper extends SQLiteOpenHelper {
//Variables ausiliares
private static String DB_PATH="data/data/com.mipaquete.instalacionesdep/databases/";
private static final String DB_NAME="instalacionesdep.db";
//private static final int DATABASE_VERSION =1;
private SQLiteDatabase myDatabase;
private final Context myContext;
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);
// TODO Auto-generated constructor stub
this.myContext = context;
}
public void createDataBase() throws IOException{
//para chequear que existe la BD
boolean dbExist = checkDataBase();
SQLiteDatabase db_read = null;
if(dbExist){
}else{
//agarramos la BD para leerla y despues la cerramos.
db_read = this.getReadableDatabase();
db_read.close();
try {
copyDataBase();
} catch (Exception e) {
// TODO: handle exception
throw new Error("Error copying database (createDataBase)");
}
}
}
public boolean checkDataBase(){
SQLiteDatabase checkDB = null;
SQLiteDatabase db_read = null;
try{
String myPath = DB_PATH+DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch (SQLException e) {
// TODO: handle exception
File dbFile = new File(DB_PATH+DB_NAME);
return dbFile.exists();
}
if(checkDB != null){
checkDB.close();
}
//regresa un true o un false dependidendo si se cumple la condicion. Los : sustituyen al else
return checkDB != null ? true : false;
}
//vamos a volcar
public void copyDataBase() throws IOException{
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH+DB_NAME;
OutputStream myOutPut = new FileOutputStream(outFileName);
Log.e("LocAndroid", "ESTOY EN copyDataBase");
//Para trasnferir el fichero en tamaños de 1024 bytes
byte[] buffer = new byte[1024];
int lenght;
//while para que nos mande el archivo.
while((lenght = myInput.read(buffer))!=-1){
if(lenght > 0){
myOutPut.write(buffer, 0, lenght);
//con esto hemos copiado la base de datos. Basicamente, El volcado del archivo
}
}
myOutPut.flush();
myOutPut.close();
myInput.close();
}
//Para abrir la base de datos
public void openDataBase() throws SQLException{
//myDatabase = this.getWritableDatabase();
String myPath = DB_PATH+DB_NAME;
myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
//Para cerrar la base de datos
public synchronized void close(){
if(myDatabase != null){
myDatabase.close();
}
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
Gracias y saludos.