簡體   English   中英

自我多對多參考OrmLite

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM