2014-05-15 12 views
6

Sto usando OrmLite 4.47. Ho seguito molti tutorial e ho letto altre domande su StackOverflow, ma non riesco a capire come risolvere questo problema.Orm Lite - Impossibile trovare il costruttore pubblico che abbia un singolo argomento (Context) per la classe helper

che è il messaggio completo

05-15 16:36:13.805: E/AndroidRuntime(15382): Caused by: java.lang.IllegalStateException: Could not find public constructor that has a single (Context) argument for helper class class com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper 
05-15 16:36:13.805: E/AndroidRuntime(15382): Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context] 

Questo è il mio databaseHelper Classe

public class MyDatabaseHelper extends OrmLiteSqliteOpenHelper { 

    // name of the database file for your application -- change to something 
    // appropriate for your app 
    private static final String DATABASE_NAME = "databas.db"; 
    // any time you make changes to your database, you may have to increase the 
    // database version 
    private static final int DATABASE_VERSION = 1; 

    //genera molte eccezioni 
    private Dao<Truck, Integer> truckDao = null; 

    //genera una sola eccezione a runtime 
    private RuntimeExceptionDao<Truck, Integer> truckRuntimeDao=null; 

    public MyDatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { 
     // TODO Auto-generated method stub 
     try { 
      TableUtils.clearTable(connectionSource, Truck.class); 
     } catch (java.sql.SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int OldVersion, 
      int newVersion) { 
     // TODO Auto-generated method stub 
     try { 
      TableUtils.dropTable(connectionSource, Truck.class, true); 
      onCreate(database,connectionSource); 
     } catch (java.sql.SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public Dao<Truck, Integer> getTruckDao() throws java.sql.SQLException{ 
     if(truckDao==null){ 
      truckDao=getDao(Truck.class); 
     } 
     return truckDao; 
    } 

    public RuntimeExceptionDao<Truck, Integer> getTruckRuntimeExceptionDao(){ 
     if(truckRuntimeDao==null){ 
      truckRuntimeDao=getRuntimeExceptionDao(Truck.class); 
     } 
     return truckRuntimeDao; 
    } 
} 

E ho avuto il problema quando nella mia attività cerco di farlo

MyDatabaseHelper helper = OpenHelperManager.getHelper(this,MyDatabaseHelper.class); 
RuntimeExceptionDao<Truck, Integer> truckDao = helper.getTruckRuntimeExceptionDao(); 

Così la banca dati la classe helper è pubblica e la classe Activity estende Activiy.

risposta

1

cercare di pulire il progetto ... è strano perché il codice sembra buono enaugh a lavorare :)

0

controllare la parte di importazione della classe che usa MyDatabaseHelper classe. Sembra che il metodo getHelper utilizzi un costruttore predefinito errato.

Il tuo messaggio di errore,

java.lang.IllegalStateException: Could not find public constructor that has a single (Context) argument for helper class class com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper 

Se si utilizza MyDatabaseHelper classe correttamente, dovrebbe essere

java.lang.IllegalStateException: Could not find public constructor that has a single (Context) argument for helper class class 'yourpackage'.MyDatabaseHelper 

Per errore che spiega,

predefinito classe OrmLiteSqliteOpenHelper solo ha un costruttore come qui di seguito, non ha un costruttore che ha un singolo argomento (contesto).

public DatabaseHelper(Context context, SQLiteDatabase.CursorFactory factory) { 
     super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
    } 

Quindi potrebbe causare un errore IllegalStateException.

4

Per quelli che funzionano in questo errore con minify abilitato (Proguard):

aggiungere la seguente configurazione per ormlite:

# ormlite 
-keep class com.j256.** 
-keepclassmembers class com.j256.** { *; } 
-keep enum com.j256.** 
-keepclassmembers enum com.j256.** { *; } 
-keep interface com.j256.** 
-keepclassmembers interface com.j256.** { *; } 
-keepclassmembers class * { 
    public <init>(android.content.Context); 
} 

check this out troppo Stackoverflow - proguard-with-ormlite-on-android

0

Crea un costruttore vuoto in il tuo POJO o classe di fagioli. Problema risolto :)

EX.

public Truck(){ 

//empty constructor in custom class 

} 
0

OK questo modo sono stato in grado di risolvere il mio problema progurad-regole non ha funzionato per me; Quindi quello che ho fatto è stato, ho reso pubblico il costruttore della classe DatabaseHelper e poi ho inizializzato l'oggetto DatabaseHelper passando il contesto di attività nel suo costruttore, in onCreate() Metodo di attività in cui volevo recuperare i dati o inviare;

Questo è il costruttore pubblico,

public DatabaseHelper(Context context) 
     { 
      super(context,DB_NAME,null,DB_VERSION,R.raw.ormlite_config); 
     } 

Qui ho inizializzata sopra oggetto classe:

databaseHelper = new DatabaseHelper(this);