Android - SQLCipher
Это мой демонстрационный проект
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());
}
}
Я получаю следующую ошибку, как я очищаю ошибки. Следующие ссылки в качестве демонстрационного проекта: https://github.com/sqlcipher/android-database-sqlcipher.
04-12 12:53:20.229: E/AndroidRuntime(7413): java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared: findLibrary returned null
04-12 12:53:20.229: E/AndroidRuntime(7413): at java.lang.Runtime.loadLibrary(Runtime.java:429)
04-12 12:53:20.229: E/AndroidRuntime(7413): at java.lang.System.loadLibrary(System.java:554)
04-12 12:53:20.229: E/AndroidRuntime(7413): at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:142)
04-12 12:53:20.229: E/AndroidRuntime(7413): at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:137)
04-12 12:53:20.229: E/AndroidRuntime(7413): at example.SQLDemoActivity.onCreate(SQLDemoActivity.java:20)
04-12 12:53:20.229: E/AndroidRuntime(7413): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-12 12:53:20.229: E/AndroidRuntime(7413): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-12 12:53:20.229: E/AndroidRuntime(7413): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-12 12:53:20.229: E/AndroidRuntime(7413): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-12 12:53:20.229: E/AndroidRuntime(7413): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-12 12:53:20.229: E/AndroidRuntime(7413): at android.os.Handler.dispatchMessage(Handler.java:99)
04-12 12:53:20.229: E/AndroidRuntime(7413): at android.os.Looper.loop(Looper.java:123)
04-12 12:53:20.229: E/AndroidRuntime(7413): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-12 12:53:20.229: E/AndroidRuntime(7413): at java.lang.reflect.Method.invokeNative(Native Method)
04-12 12:53:20.229: E/AndroidRuntime(7413): at java.lang.reflect.Method.invoke(Method.java:507)
04-12 12:53:20.229: E/AndroidRuntime(7413): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-12 12:53:20.229: E/AndroidRuntime(7413): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-12 12:53:20.229: E/AndroidRuntime(7413): at dalvik.system.NativeStart.main(Native Method)<
3 ответа
Убедитесь, что ваш проект имеет libs/
содержимое каталога настроено правильно. Вам нужны не только файлы JAR, но и подкаталоги с .so
файлы для каждой архитектуры ЦП, которую вы намереваетесь поддерживать, например, в libs/
каталог этого примера проекта.
У меня была такая же ошибка. Вот решение, которое сработало для меня.
Создайте папку с именем jniLibs рядом с вашей папкой java и поместите туда все каталоги (или просто каталоги, архитектуру которых вы намереваетесь поддерживать) с файлами *.so.
Это должно выглядеть так.
Если это работает для вас, вам не нужно иметь эти папки в папке libs.
PS Я использую Android Studio.
В вашем приложении, внутри вашего файла build.gradle, убедитесь, что у вас есть следующие строки:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile files('libs/sqlcipher-javadoc.jar')
compile files('libs/sqlcipher.jar')
}
Также щелкните правой кнопкой мыши свой проект, откройте настройки модуля и выберите вкладку зависимостей. Убедитесь, что в списке есть sqlcipher-javadoc.jar и sqlcipher.jar.