Как я могу использовать 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). Размещение моего ответа в обоих потоках, чтобы помочь другим в будущем.