2015-08-14 2 views
0

У меня есть таблица с продуктом, и мне нужно хранить связанные продукты. Для этого я использую таблицу ассоциаций для хранения идентификаторов для связанных продуктов. что в упрощенной модели выглядит следующим образом:Self-to-many ссылка OrmLite

@DatabaseTable(tableName = Product.TABLE_NAME) 
public class Product { 

    public static final String TABLE_NAME = "product"; 

    public interface Fields extends BaseModel.Fields { 
     String MODEL = "model"; 
     String SERIES = "series"; 
     String IS_NEW = "is_new"; 
     String IS_BESTSELLER = "is_bestseller"; 
     String FICHE = "fiche"; 
     String MANUAL = "manual"; 
     String URL = "web_url"; 
     String VIDEO_URL = "video_presentation"; 
     String VIDEO_360_URL = "video_360_presentation"; 
    } 

    @DatabaseField(columnName = Fields.ID, id = true) 
    private long id; 

    @ForeignCollectionField(columnName = Feature.TABLE_NAME) 
    private ForeignCollection<ProductFeatures> features; 

    @ForeignCollectionField(columnName = RelatedProducts.TABLE_NAME) 
    private ForeignCollection<RelatedProducts> related; 

    public Product() { 
    } 
} 


@DatabaseTable(tableName = RelatedProducts.TABLE_NAME) 
public class RelatedProducts { 
    public static final String TABLE_NAME = "related_products"; 
    public interface Fields extends BaseModel.Fields { 

     String PRODUCT_FK = "product_id"; 
     String RELATED_FK = "related_product_id"; 
    } 

    @DatabaseField(canBeNull = false, foreign = true, columnName = Fields.PRODUCT_FK 
      , foreignAutoRefresh = true, maxForeignAutoRefreshLevel = 2, columnDefinition = 
      "INTEGER NOT NULL REFERENCES " + Product.TABLE_NAME + "(" + Product.Fields.ID + ")") 
    Product product_; 

    @DatabaseField(canBeNull = false, foreign = true, columnName = Fields.RELATED_FK 
      , foreignAutoRefresh = true, maxForeignAutoRefreshLevel = 2, columnDefinition = 
      "INTEGER NOT NULL REFERENCES " + Product.TABLE_NAME + "(" + Product.Fields.ID + ")") 
    Product relatedProduct; 

    public RelatedProducts() { 
    } 

Но при попытке добавить/экземпляр DB, а значит создать всю логику я получаю сообщение об ошибке:

08-14 10:43:29.014 24133-24170/XXX.XXX.xxx E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #3 
    Process: XXX.XXX.xxx, PID: 24133 
    java.lang.RuntimeException: An error occured while executing doInBackground() 
      at android.os.AsyncTask$3.done(AsyncTask.java:304) 
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
      at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
      at java.lang.Thread.run(Thread.java:818) 
    Caused by: java.lang.IllegalArgumentException: ORMLite does not know how to store class XXX.XXX.xxx.model.Product for field product. Use another class or a custom persister. 
      at com.j256.ormlite.field.FieldType.<init>(FieldType.java:189) 
      at com.j256.ormlite.table.DatabaseTableConfig.convertFieldConfigs(DatabaseTableConfig.java:236) 
      at com.j256.ormlite.table.DatabaseTableConfig.extractFieldTypes(DatabaseTableConfig.java:101) 
      at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:153) 
      at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:128) 
      at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:119) 
      at com.j256.ormlite.dao.BaseDaoImpl$5.<init>(BaseDaoImpl.java:921) 
      at com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:921) 
      at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:72) 
      at com.j256.ormlite.field.FieldType.configDaoInformation(FieldType.java:297) 
      at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:201) 
      at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:128) 
      at com.j256.ormlite.dao.BaseDaoImpl.<init>(BaseDaoImpl.java:119) 
      at com.j256.ormlite.dao.BaseDaoImpl$5.<init>(BaseDaoImpl.java:921) 
      at com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:921) 
      at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:72) 
      at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:218) 
      at com.j256.ormlite.table.TableUtils.createTableIfNotExists(TableUtils.java:61) 
      at XXX.XXX.commons.util.db.OrmLiteTableUtils.createIfNotExists(OrmLiteTableUtils.java:35) 
      at XXX.XXX.infrastructure.db.DatabaseHelper.onCreate(DatabaseHelper.java:80) 
      at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.onCreate(OrmLiteSqliteOpenHelper.java:209) 
      at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251) 
      at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
      at com.j256.ormlite.android.AndroidConnectionSource.getReadWriteConnection(AndroidConnectionSource.java:66) 
      at com.j256.ormlite.android.AndroidConnectionSource.getReadOnlyConnection(AndroidConnectionSource.java:54) 
      at com.j256.ormlite.dao.BaseDaoImpl.idExists(BaseDaoImpl.java:805) 
      at com.j256.ormlite.dao.BaseDaoImpl.createOrUpdate(BaseDaoImpl.java:335) 
      at com.j256.ormlite.dao.RuntimeExceptionDao.createOrUpdate(RuntimeExceptionDao.java:249) 
      at XXX.XXX.infrastructure.db.GenericDao.persist(GenericDao.java:44) 
      at XXX.XXX.xxx.server.DeviceRegistration.addUser(DeviceRegistration.java:54) 
      at XXX.XXX.xxx.server.DeviceRegistration.doInBackground(DeviceRegistration.java:36) 
      at XXX.XXX.xxx.server.DeviceRegistration.doInBackground(DeviceRegistration.java:20) 
      at android.os.AsyncTask$2.call(AsyncTask.java:292) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
            at java.lang.Thread.run(Thread.java:818) 

Любые идеи, как сделать такую ​​ссылку?

+0

Вы уверены, что этот продукт имеет тот же пакет, что и ваш объект 'Product'? Вы уверены, что у вас нет плохого «импорта»? – Gray

ответ

0

IllegalArgumentException: ORMLite does not know how to store class XXX.XXX.xxx.model.Product for field product. Use another class or a custom persister.

О Единственное, что я могу догадаться, что есть неправильное Product здесь. То, что поле Product указывает на другой класс Product, который не имеет аннотации @DatabaseTable, и поэтому ORMLite не знает, что с ним делать.

Удостоверьтесь, что XXX.XXX.xxx.model.Product - правильное название упаковки.