La base de datos no se copia correctamente en OnePlus Two

Estoy creando una aplicación para Android y estoy usando la base de datos sqlite en ella. Para eso he colocado un archivo sqlite en carpeta de activos del proyecto y estoy copiando este archivo al teléfono mientras que mi primera ejecución de la aplicación usando código abajo.

private void copyDataBase() throws IOException { new File(DB_PATH).mkdirs(); InputStream myInput = appContext.getAssets().open(DB_NAME); String outFileName = DB_PATH + DB_NAME; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } 

Pero estoy recibiendo estos errores.

  09-21 18:03:56.841: E/SQLiteLog(7850): (1) no such table: tbl_player 

Pero esta tabla existe en el archivo de activos. Así que busqué el archivo de la base de datos del teléfono usando este método.

 public static void exportDB(String databaseName, Context context) { try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); if (sd.canWrite()) { String currentDBPath = "//data//" + context.getPackageName() + "//databases//" + databaseName + ""; String backupDBPath = "sensor_game.db"; File currentDB = new File(data, currentDBPath); File backupDB = new File(sd, backupDBPath); if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB) .getChannel(); FileChannel dst = new FileOutputStream(backupDB) .getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } } catch (Exception e) { } } 

Y descubrí que no hay ninguna tabla en el archivo de base de datos recuperado.

Nota: Este problema se produce sólo en OnePlus Two y funciona bien en Nexus 4 , Htc 820 , Moto E , Galxy S3 y Galaxy Quottro

La ruta de la base de datos puede ser diferente en diferentes dispositivos. Necesita utilizar Context.getDatabasePath(String) para obtener la ruta de la base de datos.

p.ej

 File backupDB = context.getDatabasePath(backupDBPath); 

Después de un largo intentos y búsquedas forcé a asumir que debería haber un error en la fabricación de OP2, ya que está funcionando bien en todos los demás dispositivos.

Y cambié mi enfoque para crear base de datos utilizando la consulta en lugar de copiar el archivo de base de datos de los activos. Como el código abajo

 import java.io.File; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class MySQLiteHelper extends SQLiteOpenHelper implements DBConstants { private static MySQLiteHelper mInstance = null; private SQLiteDatabase myDataBase; private static String DB_PATH = ""; public MySQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); try { if (checkDataBase()) openDataBase(); else myDataBase = this.getReadableDatabase(); } catch (Exception e) { } } public static MySQLiteHelper instance(Context context) { File outFile = context.getDatabasePath(DATABASE_NAME); DB_PATH = outFile.getPath(); if (mInstance == null) { mInstance = new MySQLiteHelper(context); } return mInstance; } private void openDataBase() throws Exception { try { myDataBase = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE); } catch (SQLException e) { // TODO: handle exception } } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { checkDB = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { /** database does't exist yet. */ } catch (Exception e) { } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } @Override public void onCreate(SQLiteDatabase db) { Log.v("log_tag", "onCreate"); myDataBase = db; // creating a sample table String CREATE_DEVICE_TABLE = "CREATE TABLE " + DEVICE + " (" + KEY_DEVICEID + " TEXT, " + KEY_OPERATOR + " TEXT, " + KEY_DEVICENAME + " TEXT, " + KEY_DEVICETOTALMEMORY + " INTEGER, " + KEY_SCREENWIDTH + " INTEGER, " + KEY_SCREENHEIGHT + " INTEGER, " + KEY_OPERATINGSYSTEM + " TEXT)"; db.execSQL(CREATE_DEVICE_TABLE); // other tables also can be created from here. } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DEVICE); // Create tables again (as per requirement) this.onCreate(db); } public Cursor rawQuery(String qry) { return myDataBase.rawQuery(qry, null); } public long insert(String tableName, ContentValues cv) { return myDataBase.insert(tableName, null, cv); } public void insertWithOnConflict(String tableName, ContentValues cv, int flag) { myDataBase.insertWithOnConflict(tableName, null, cv, flag); } public long update(String tableName, ContentValues cv, String whereClose) { return myDataBase.update(tableName, cv, whereClose, null); } public int deleteData(String table_name, String whereClause) { return (int) myDataBase.delete(table_name, whereClause, null); } } 

Y funcionó para mí

¡Gracias!

He encontrado la solución para esto, he utilizado debajo de la función:

 public void createDb() { boolean dbExist = checkDataBase(); if (dbExist) { // do nothing - database already exist } else { // call close() for properly copy database file this.getReadableDatabase().close(); try { copyDataBase(); } catch (IOException e) { e.printStackTrace(); throw new Error("Error copying database"); } } } 

Como por este post debemos llamar a close() y puede empujar la base de datos a Oneplus dos dispositivos también.

  • Excepción Sqlite, error de sintaxis
  • Android SQLiteException "no such table" durante la compilación: tabla INSERT INTO
  • Función de actualización en android SQLite no funciona
  • Base de datos SQlite programaticamente convertir en formato de archivo de Excel en Android
  • Uso de ORM de azúcar con UUID o Joda-Time
  • SQLITE INSERT con ID manual (clave principal)
  • Búsqueda acentuada en sqlite (android)
  • Custom SimpleCursorAdapter, consulta de base de datos y NullPointerException
  • Cómo guardar la matriz de bytes (byte ) en la tabla SQLite?
  • La aplicación de Android se bloquea al iniciar: SQLite NullPointerException en ContactsFragment
  • "Código de error 5: la base de datos está bloqueada" cuando se utiliza un ContentProvider
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.