Как я могу использовать ORMLite с SQLCipher вместе в Android?
Я хотел бы использовать OrmLite с SQLCipher в моем Android-проекте, но обе библиотеки имеют собственный абстрактный класс SQLiteOpenHelper
для реализации. Java не позволяет классу расширять два класса, и если я реализую отдельно, они не будут связываться друг с другом.
Как я могу работать вместе? Как решить проблему с реализацией SQLiteOpenHelper
?
Ответы
Ответ 1
Это должно быть возможно @Bruno.
Один из способов, который должен работать, - просто скопировать ORMLite OrmLiteSqliteOpenHelper
class в свой проект, переименовать его в LocalOrmLiteSqliteOpenHelper
или что-то еще, и измените базовый класс как вспомогательный класс SQLCipher
. Я не могу поверить, что они не переименовали класс в SQLCipherSQLiteOpenHelper
. (Ворчание)
public abstract class LocalOrmLiteSqliteOpenHelper
extends info.guardianproject.database.sqlcipher.SQLiteOpenHelper {
Другим способом было бы помочь вашему помощнику расширить SQLCipher
SQLiteOpenHelper, а затем реализовать различные вещи, которые вам нужны от OrmLiteSqliteOpenHelper
самостоятельно. Однако это потребует немного больше работы. ORMLite должен делать небольшой танец с подключением к базе данных, пока база данных создается, иначе она будет рекурсивной.
Сообщите мне, работает ли это.
Ответ 2
Я отменил ответ Rejinderi в патче для ORMLite 4.43 и скомпилировал его в файл JAR. Чтобы интегрировать его в проект Android, выполните следующие действия:
Однако вы не должны доверять мне, чтобы предоставить unmanipulated JAR файл и следовать инструкциям сборки в патче.
РЕДАКТИРОВАТЬ: В исправленной библиотеке вызовы getReadableDatabase()
, getWritableDatabase()
и конструктор OrmLiteSqliteOpenHelper
должны быть переданы паролем в качестве дополнительного параметра. Если вы используете помощник БД, достаточно растяните его, чтобы передать пароль в OrmLiteSqliteOpenHelper.
Ответ 3
Просто чтобы обновить тех, кому нужна помощь, вы можете скопировать всю часть orroidite в orroidite в orrealite в свой проект и изменить импорт всей ссылки пакета android db на версию SQLCipher.
В основном вы должны изменить весь пакет, который соответствует android.database.sqlite, на net.sqlcipher.database
Например, из
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
Для
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
После этого поместите параметр пароля db в вызов getWriteableDatabase в AndroidConnectionSource.java
Ответ 4
Применяя патч, поставляемый ge0rg I, обнаружил, что queryForAll()
выбрасывает NoSuchMethod exception
. После некоторого исследования я обнаружил, что это результат rawQuery, возвращающего net.sqlcipher.Cursor
, а курсор, возвращаемый getQuery (в AndroidCompiledStatement), является android.database.Cursor
. Я просто изменил импорт AndoridCompiledStatement в:
import net.sqlcipher.Cursor;
И модифицированный getCursor() для возврата android.database.Cursor:
public android.database.Cursor getCursor() { ...
С этими изменениями он работает для меня. Хотя мне нужно будет немного поиграть, чтобы быть полностью уверенным.
Ответ 5
Я знаю, что это довольно старая нить. Но в последнее время мне пришлось пойти так же. Я прочитал два потока в поиске решения: this и .
- Я последовал за ge0rg answer, он почти сработал, возникли некоторые проблемы, и я должен заменить методы внутри своего кода (я хотел его избежать).
- Я сделал то, что Элиотт Ройнет предложил здесь, и он работал хорошо, за исключением того, что мне нужно было добавить один метод в класс Helper, чтобы принять пароль, и я это сделал.
- Я хотел исключить код в lib, чтобы иметь более интеллектуальное решение вместо кода, поэтому я создаю lib/module отдельно.
И теперь у меня есть решение, которое работает (вы можете клонировать рабочую демонстрацию от GitHub). Размещение моего ответа в обоих потоках, чтобы помочь другим в будущем.