У меня есть таблица с продуктом, и мне нужно хранить связанные продукты. Для этого я использую таблицу ассоциаций для хранения идентификаторов для связанных продуктов. что в упрощенной модели выглядит следующим образом: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)
Любые идеи, как сделать такую ссылку?
Вы уверены, что этот продукт имеет тот же пакет, что и ваш объект 'Product'? Вы уверены, что у вас нет плохого «импорта»? – Gray