Estoy usando SQLCIPHER para leer o escribir la base de datos que consigue el error
Hiee, estoy usando sqlcipher para leer la base de datos, pero antes de leer los datos que está dando el error siguiente.Below es mi logcat por favor echar un vistazo.
E/AndroidRuntime(21826): FATAL EXCEPTION: main 02-27 11:33:10.608: E/AndroidRuntime(21826): java.lang.UnsatisfiedLinkError: Native method not found: net.sqlcipher.database.SQLiteDatabase.dbopen:(Ljava/lang/String;I)V 02-27 11:33:10.608: E/AndroidRuntime(21826): at net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method) 02-27 11:33:10.608: E/AndroidRuntime(21826): at net.sqlcipher.database.SQLiteDatabase. <init>(SQLiteDatabase.java:1942) 02-27 11:33:10.608: E/AndroidRuntime(21826): at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1920) 02-27 11:33:10.608: E/AndroidRuntime(21826): at example.SQLDemoActivity.onCreate(SQLDemoActivity.java:19) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.app.Activity.performCreate(Activity.java:5020) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.app.ActivityThread.access$600(ActivityThread.java:149) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.os.Handler.dispatchMessage(Handler.java:99) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.os.Looper.loop(Looper.java:153) 02-27 11:33:10.608: E/AndroidRuntime(21826): at android.app.ActivityThread.main(ActivityThread.java:4987) 02-27 11:33:10.608: E/AndroidRuntime(21826): at java.lang.reflect.Method.invokeNative(Native Method) 02-27 11:33:10.608: E/AndroidRuntime(21826): at java.lang.reflect.Method.invoke(Method.java:511) 02-27 11:33:10.608: E/AndroidRuntime(21826): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821) 02-27 11:33:10.608: E/AndroidRuntime(21826): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) 02-27 11:33:10.608: E/AndroidRuntime(21826): at dalvik.system.NativeStart.main(Native Method)
A continuación se muestra el enlace desde donde tengo esta clase sqlcipher que estoy tratando de ejecutar sqlcipher enlace
- Android: ORDER BY en la consulta
- La aplicación de Android se bloquea al iniciar: SQLite NullPointerException en ContactsFragment
- La tabla de actualización utilizando el método rawQuery () no funciona
- SQLite selecciona todos los registros de hoy y día anterior
- Sqlite - en rebaja
Esta es la clase en la que estoy llamando a SQLiteDatabase.loadLibs (este), por favor, eche un vistazo
public class SQLDemoActivity extends Activity { EventDataSQLHelper eventsData; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //you must set Context on SQLiteDatabase first SQLiteDatabase.loadLibs(this); String password = "foo123"; eventsData = new EventDataSQLHelper(this); //then you can open the database using a password SQLiteDatabase db = eventsData.getWritableDatabase(password); for (int i = 1; i < 100; i++) addEvent("Hello Android Event: " + i, db); db.close(); db = eventsData.getReadableDatabase(password); Cursor cursor = getEvents(db); showEvents(cursor); db.close(); } @Override public void onDestroy() { eventsData.close(); } private void addEvent(String title, SQLiteDatabase db) { ContentValues values = new ContentValues(); values.put(EventDataSQLHelper.TIME, System.currentTimeMillis()); values.put(EventDataSQLHelper.TITLE, title); db.insert(EventDataSQLHelper.TABLE, null, values); } private Cursor getEvents(SQLiteDatabase db) { Cursor cursor = db.query(EventDataSQLHelper.TABLE, null, null, null, null, null, null); startManagingCursor(cursor); return cursor; } private void showEvents(Cursor cursor) { StringBuilder ret = new StringBuilder("Saved Events:\n\n"); while (cursor.moveToNext()) { long id = cursor.getLong(0); long time = cursor.getLong(1); String title = cursor.getString(2); ret.append(id + ": " + time + ": " + title + "\n"); } Log.i("sqldemo",ret.toString()); } }
Y debajo está el cuerpo del método
public class SQLiteDatabase extends SQLiteClosable { private static final String TAG = "Database"; private static final int EVENT_DB_OPERATION = 52000; private static final int EVENT_DB_CORRUPT = 75004; public int status(int operation, boolean reset){ return native_status(operation, reset); } private static void loadICUData(Context context, File workingDir) { try { File icuDir = new File(workingDir, "icu"); if(!icuDir.exists()) icuDir.mkdirs(); File icuDataFile = new File(icuDir, "icudt46l.dat"); if(!icuDataFile.exists()) { ZipInputStream in = new ZipInputStream(context.getAssets().open("icudt46l.zip")); in.getNextEntry(); OutputStream out = new FileOutputStream(icuDataFile); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.flush(); out.close(); } } catch (Exception e) { Log.e(TAG, "Error copying icu data file", e); } } public static void loadLibs (Context context) { loadLibs(context, context.getFilesDir()); } public static void loadLibs (Context context, File workingDir) { System.loadLibrary("stlport_shared"); System.loadLibrary("sqlcipher_android"); System.loadLibrary("database_sqlcipher"); boolean systemICUFileExists = new File("/system/usr/icu/icudt46l.dat").exists(); String icuRootPath = systemICUFileExists ? "/system/usr" : workingDir.getAbsolutePath(); setICURoot(icuRootPath); if(!systemICUFileExists) { loadICUData(context, workingDir); } } }
- Utilizar SimpleCursorAdapter.ViewBinder para cambiar el color de TextView
- ¿Cuántas filas puedo insertar en una tabla en SQLite Android?
- Obtención de todos los registros de sqlite android
- Lectura de datos de 4 archivos CSV estáticos en Android: Best Approach?
- GetWritableDatabase llamado recursivamente
- Diferencia entre rawquery y execSQL en android sqlite base de datos
- La base de datos de Android recrea cada vez que se inicia la aplicación
- Cómo agregar la cláusula de límite a manageQuery en android
Ese error ocurre generalmente si usted no ha llamado SQLiteDatabase.loadLibs()
antes de intentar utilizar la base de datos.
El UnsatisfiedLinkError
se debe a que las bibliotecas nativas no se incluyen con su aplicación. Para obtener un ejemplo sobre la integración de SQLCipher con una aplicación existente, revise este tutorial. Alternativamente, eche un vistazo a la suite de pruebas SQLCipher for Android.
@CommonsWare es correcto y lo votó a la baja.
Cuando su aplicación se reanuda de un sueño largo, las libs se han apagado y por lo tanto la restauración del estado se está estrellando porque las librerías están ausentes.
Pon tu SQLiteDatabase.loadLibs (este); Delante de super.onCreate (savedInstanceState)
@Override public void onCreate(Bundle savedInstanceState) { //you must set Context on SQLiteDatabase first SQLiteDatabase.loadLibs(this); super.onCreate(savedInstanceState);
Si SQLiteDatabase.loadLibs()
está allí, asegúrese de agregar estas líneas al archivo ProGuard:
#Keep SQLCypher classes -keep class net.sqlcipher.** { *; }