[英]Self many-to-many reference OrmLite
我的桌子上有產品,我需要存儲相關產品。 為此,我使用關聯表來存儲相關產品的ID。 在簡化模型中,它看起來像:
@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() {
}
但是,當嘗試添加/實例化數據庫時,這意味着創建整個邏輯,我得到一個錯誤:
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)
有什么想法可以做這樣的參考嗎?
IllegalArgumentException:ORMLite不知道如何為現場產品存儲類XXX.XXX.xxx.model.Product。 使用其他類或自定義持久性。
我唯一能猜到的是這里有一個不正確的Product
。 Product
字段指向一個沒有@DatabaseTable
批注的其他Product
類,因此ORMLite不知道如何處理它。
確保XXX.XXX.xxx.model.Product
是正確的程序包名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.