2012-02-07 9 views
14

Me gustaría usar OrmLite con SQLCipher en mi proyecto de Android, pero ambas bibliotecas tienen su propia clase abstracta SQLiteOpenHelper para implementar. Java no permite que una clase amplíe dos clases y si lo implemento por separado, no se comunicarán entre sí.¿Cómo puedo usar ORMLite con SQLCipher en Android?

¿Cómo puedo trabajar con los dos juntos? ¿Cómo resuelvo el problema de implementación SQLiteOpenHelper?

+0

La versión de SQLCiphers es una versión modificada del SQLiteOpenHelper, es decir, no es la misma clase, para hacer que estos dos funcionen bien juntos, tendrá que volver a trabajar toda la biblioteca OrmLite para usar los paquetes SQLCipher en lugar. – Jens

+1

Seguramente sería maravilloso si OrmLite hiciera esto fuera de la caja. También estaría bien si SqlCipher tuviera un artefacto Maven. Parecen dos bibliotecas que obviamente necesitan trabajar entre sí (mejor). –

Respuesta

3

Debe ser posible @Bruno.

Una manera en que debería funcionar es sólo copiar ORMLite's OrmLiteSqliteOpenHelper class en su proyecto, cambie el nombre a LocalOrmLiteSqliteOpenHelper o algo así, y cambiar la clase base para ser la clase SQLCipher ayudante. No puedo creer que no hayan cambiado el nombre de la clase para que sea SQLCipherSQLiteOpenHelper. (Queja)

public abstract class LocalOrmLiteSqliteOpenHelper 
    extends info.guardianproject.database.sqlcipher.SQLiteOpenHelper { 

Otra forma sería tener su ayudante extender SQLiteOpenHelper SQLCipher 's y luego poner en práctica las diferentes cosas que necesita de OrmLiteSqliteOpenHelper mismo. Sin embargo, eso requeriría un poco más de trabajo. ORMLite tiene que bailar un poco con las conexiones de bases de datos mientras se crea la base de datos, de lo contrario es recursiva.

Avísame si cualquiera de estos funciona.

+3

Lo intenté pero recibo errores de tiempo de compilación EX: "nuevo AndroidConnectionSource (esto);" –

+1

Mismo error. El constructor AndroidConnectionSource (OrmLiteSqliteOpenHelper) no está definido. ¿Por qué se acepta esta respuesta? –

+2

La respuesta está desactualizada. Era válido para versiones anteriores de ORMLite. Entonces, chicos, que se quejan, esperen mientras alguien actualizará la respuesta –

3

Sólo para actualizar aquellos que necesitan ayuda en esto, puede copiar toda la parte fuente de Android de ormlite en su proyecto y cambie la importación de todas las referencias del paquete db de Android a la versión de SQLCipher.

Básicamente, usted tiene que cambiar todo el paquete que coincide con android.database.sqlite a net.sqlcipher.database

Por ejemplo, desde

import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

Para

import net.sqlcipher.database.SQLiteDatabase; 
import net.sqlcipher.database.SQLiteOpenHelper; 

Después de eso pon el parámetro contraseña de db a la llamada de getWriteableDatabase en An droidConnectionSource.java

+0

Gracias por su respuesta. Pero cuando estoy obteniendo los datos usando queryforall() está lanzando java.lang.NoSuchMethodError: net.sqlcipher.database.SQLiteDatabase. rawQuery. pero tengo ese método en la clase sqlitedatabase. ¿Cómo resolver esta idea? – Roster

+0

No profundicé en esto. Dejé de usar SQLCipher en este momento, realmente no puedo ayudar, lo siento. – Rejinderi

6

he destilada por la respuesta Rejinderi en un patch for ORMLite 4.43 y compilado en un JAR file. Para integrarlo en su proyecto Android, haga lo siguiente:

  1. Siga el SQLCipher for Android HOWTO para obtener SQLCipher en su proyecto
  2. Añadir ORMLite a su proyecto (ver What is a good tutorial for using ORMLite with SQLite and Android)
  3. Reemplazar libs/ormlite-android.jar con ormlite-android-sqlcipher.jar
  4. Agregue su contraseña de base de datos secreta a los métodos de apertura de base de datos apropiados

Sin embargo, no debe confiar en que proporcione un archivo JAR no manipulado y en su lugar siga las instrucciones de compilación en el parche.

EDIT: Con la biblioteca parcheado, las llamadas a getReadableDatabase(), getWritableDatabase() y el constructor de OrmLiteSqliteOpenHelper necesario transmitir la contraseña como parámetro adicional. Si está utilizando un ayudante DB, extiéndalo apropiadamente para pasar la contraseña a OrmLiteSqliteOpenHelper.

+0

sí? ¿Cuál es tu contraseña de DNS? :) – stephen

+0

El mío es "contraseña"; pero de lo que estaba hablando es de que el archivo JAR que proporcioné también podría contener una línea 'sendCovertMessageTo (" ge0rg ", your_db_password)' – ge0rg

+1

No esperaba que tú también respondieras eso. Supongo que eso prueba tu punto. Si es aproximadamente del mismo tamaño que el original, ¿dónde encontraría los recursos/medios para enviar información a alguna parte? Soy realmente curioso.Tengo un interés y poca comprensión de la seguridad en el dalvik. – stephen

1

Aplicando el parche provisto por ge0rg I para encontrar que queryForAll() arroja un NoSuchMethod exception. Después de algunas investigaciones descubrí que esto es un resultado de rawQuery que devuelve un net.sqlcipher.Cursor y el cursor devuelto por getQuery (en AndroidCompiledStatement) es un android.database.Cursor. Simplemente modificado importaciones de AndoridCompiledStatement a:

import net.sqlcipher.Cursor; 

y modificar getCursor() para devolver un android.database.Cursor:

public android.database.Cursor getCursor() { ... 

Con estos cambios Parece que funciona para mí. Aunque tendré que jugar un poco más para estar completamente seguro.

0

Sé que este es un hilo bastante viejo. Pero tuve que ir de la misma manera hace poco. He leído dos hilos en busca de solución: this y this.

  1. I seguido de ge0rg answer, que casi funcionó, fueron algunos de los problemas y tengo que reemplazar los métodos dentro de mi código (quería evitarlo).
  2. Hice lo que Eliott Roynette sugirió here y funcionó bien, excepto que necesitaba agregar un método a la clase Helper para aceptar la contraseña y lo hice.
  3. Quería excluir código en lib para tener más solución inteligente en lugar de código, así que compilo lib/module por separado.

Y ahora tengo solution que funciona (puede clonar la demostración de trabajo de GitHub). Colocando mi respuesta en ambos hilos para ayudar a otros en el futuro.

+0

Escribo mi propia capa ORM en ese proyecto, era más rápido y limpio. –

Cuestiones relacionadas