android database sqlite jni sqlcipher

android - el archivo está encriptado o no es una base de datos(Exception net.sqlcipher.database.SQLiteException)



jni (2)

dado que mi antiguo archivo db no está encriptado, entonces ¿qué debo configurar en ese caso?

SQLCipher para Android puede abrir una base de datos no encriptada usando "" como contraseña.

He intentado con pasar null en la cadena de contraseña y también con "", pero sin suerte

Entonces tambien:

  • Usted tiene un error en su código, o
  • La base de datos ya está encriptada con otra contraseña, o
  • La base de datos está corrupta.

Estoy tratando de usar sqlcipher lib para cifrar mi base de datos desde una base de datos ya existente, pero al acceder a la base de datos anterior (es decir, abrir el archivo db) da esta excepción:

02-27 13:12:21.231: E/AndroidRuntime(14687): FATAL EXCEPTION: main 02-27 13:12:21.231: E/AndroidRuntime(14687): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.sqlcipher/example.SQLDemoActivity}: net.sqlcipher.database.SQLiteException: file is encrypted or is not a database 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.app.ActivityThread.access$600(ActivityThread.java:149) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.os.Handler.dispatchMessage(Handler.java:99) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.os.Looper.loop(Looper.java:153) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.app.ActivityThread.main(ActivityThread.java:4987) 02-27 13:12:21.231: E/AndroidRuntime(14687): at java.lang.reflect.Method.invokeNative(Native Method) 02-27 13:12:21.231: E/AndroidRuntime(14687): at java.lang.reflect.Method.invoke(Method.java:511) 02-27 13:12:21.231: E/AndroidRuntime(14687): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821) 02-27 13:12:21.231: E/AndroidRuntime(14687): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) 02-27 13:12:21.231: E/AndroidRuntime(14687): at dalvik.system.NativeStart.main(Native Method) 02-27 13:12:21.231: E/AndroidRuntime(14687): Caused by: net.sqlcipher.database.SQLiteException: file is encrypted or is not a database 02-27 13:12:21.231: E/AndroidRuntime(14687): at net.sqlcipher.database.SQLiteDatabase.native_setLocale(Native Method) 02-27 13:12:21.231: E/AndroidRuntime(14687): at net.sqlcipher.database.SQLiteDatabase.setLocale(SQLiteDatabase.java:2102) 02-27 13:12:21.231: E/AndroidRuntime(14687): at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1968) 02-27 13:12:21.231: E/AndroidRuntime(14687): at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:901) 02-27 13:12:21.231: E/AndroidRuntime(14687): at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:944) 02-27 13:12:21.231: E/AndroidRuntime(14687): at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:107) 02-27 13:12:21.231: E/AndroidRuntime(14687): at example.SQLDemoActivity.onCreate(SQLDemoActivity.java:42) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.app.Activity.performCreate(Activity.java:5020) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 02-27 13:12:21.231: E/AndroidRuntime(14687): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 02-27 13:12:21.231: E/AndroidRuntime(14687): ... 11 more

dado que mi antiguo archivo db no está encriptado, ¿qué debo establecer?

He intentado pasar null en la cadena de contraseña y también con "" pero sin suerte

problema informado en https://github.com/sqlcipher/android-database-sqlcipher/issues/124


  1. compruebe si está utilizando la importación correcta: import net.sqlcipher.database.SQLiteDatabase;

  2. cargar libs en el inicio de la aplicación de esta manera:

SQLiteDatabase.loadLibs(this); //this = activity (usually a SplashScreen or MainActivity) db = DatabaseHandler.getInstance(this); //if it''s singleton (and i suggest making it as such) db.getReadableDatabase(ConstantsHandler.DATABASE_PASSWORD); db.close();

  1. asegúrese de que no esté encriptado con una contraseña

  2. Verifique los permisos de archivo:

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

<uses-permission android: name = "android.permission.READ_EXTERNAL_STORAGE" />