Android Ormlite:具有id的外键

Android Ormlite:具有id的外键,android,ormlite,Android,Ormlite,我正在我的android项目中使用ormlite。我正在设法让外键工作。 这就是我现在所拥有的 我得到以下结构的json,需要将其保存到数据库中。为此,我创建了以下对象类 我上的第一堂课是: @DatabaseTable(tableName = "gallery") public class Gallery extends DatabaseModel { public static final String FIELD_ID = "gal_id"; public static final Str

我正在我的android项目中使用ormlite。我正在设法让外键工作。 这就是我现在所拥有的

我得到以下结构的json,需要将其保存到数据库中。为此,我创建了以下对象类

我上的第一堂课是:

@DatabaseTable(tableName = "gallery")
public class Gallery extends DatabaseModel {
public static final String FIELD_ID = "gal_id";
public static final String FIELD_TITLE = "gal_title";
public static final String FIELD_IMAGES = "gal_images";

//ID
@DatabaseField(columnName = FIELD_ID, id = true)
@SerializedName(FIELD_ID)
private int id;
//FIELDS
@DatabaseField(columnName = FIELD_TITLE)
@SerializedName(FIELD_TITLE)
private String title;
@ForeignCollectionField()
@SerializedName(FIELD_IMAGES)
private ForeignCollection<GalleryImage> images;

public Gallery() {

}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String published) {
    this.title = title;
}

public ForeignCollection<GalleryImage> getImages() {
    return images;
}

public void setImages(ForeignCollection<GalleryImage> images) {
    this.images = images;
}

@Override
public void SaveAll(DataRepository repo, List<? extends DatabaseModel> models) {
    repo.galleryRepository.deleteAll();
    repo.galleryRepository.saveAll(repo, models);
}

@Override
public void Save(DataRepository repo) {
    repo.galleryRepository.create(this);
}
}
正如您所看到的,ForeingCollection有不止一个GalleryImage。在GalleryImage类中,我有一个名为“pho_gal_Id”的Id,它链接回“gal_Id”字段

这是我运行这两个类时得到的异常:

05-23 09:46:57.040    4613-4613/be.appmax.twentebad.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: be.appmax.twentebad.app, PID: 4613
    java.lang.RuntimeException: Unable to start activity ComponentInfo{be.appmax.twentebad.app/be.appmax.twentebad.app.MainActivity}: java.lang.RuntimeException: java.sql.SQLException: Foreign collection class be.appmax.twentebad.app.models.database.GalleryImage for field 'images' column-name does not contain a foreign field of class be.appmax.twentebad.app.models.database.Gallery
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
            at android.app.ActivityThread.access$800(ActivityThread.java:145)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5144)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.RuntimeException: java.sql.SQLException: Foreign collection class be.appmax.twentebad.app.models.database.GalleryImage for field 'images' column-name does not contain a foreign field of class be.appmax.twentebad.app.models.database.Gallery
            at be.appmax.twentebad.app.database.DatabaseHelper.onCreate(DatabaseHelper.java:70)
            at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.onCreate(OrmLiteSqliteOpenHelper.java:209)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
            at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
            at com.j256.ormlite.android.AndroidConnectionSource.getReadWriteConnection(AndroidConnectionSource.java:66)
            at com.j256.ormlite.android.AndroidConnectionSource.getReadOnlyConnection(AndroidConnectionSource.java:54)
            at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:243)
            at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:196)
            at com.j256.ormlite.stmt.StatementExecutor.queryForAll(StatementExecutor.java:118)
            at com.j256.ormlite.dao.BaseDaoImpl.queryForAll(BaseDaoImpl.java:241)
            at be.appmax.twentebad.app.database.repositories.MenuRepository.getAll(MenuRepository.java:87)
            at be.appmax.twentebad.app.MainActivity.readDatabase(MainActivity.java:103)
            at be.appmax.twentebad.app.MainActivity.onCreate(MainActivity.java:65)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
            at android.app.ActivityThread.access$800(ActivityThread.java:145)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5144)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.sql.SQLException: Foreign collection class be.appmax.twentebad.app.models.database.GalleryImage for field 'images' column-name does not contain a foreign field of class be.appmax.twentebad.app.models.database.Gallery
            at com.j256.ormlite.field.FieldType.findForeignFieldType(FieldType.java:1020)
            at com.j256.ormlite.field.FieldType.configDaoInformation(FieldType.java:390)
            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.doCreateDao(DaoManager.java:359)
            at com.j256.ormlite.dao.DaoManager.createDaoFromConfig(DaoManager.java:326)
            at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:55)
            at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:218)
            at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:53)
            at be.appmax.twentebad.app.database.DatabaseHelper.onCreate(DatabaseHelper.java:65)
            at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.onCreate(OrmLiteSqliteOpenHelper.java:209)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
            at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
            at com.j256.ormlite.android.AndroidConnectionSource.getReadWriteConnection(AndroidConnectionSource.java:66)
            at com.j256.ormlite.android.AndroidConnectionSource.getReadOnlyConnection(AndroidConnectionSource.java:54)
            at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:243)
            at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:196)
            at com.j256.ormlite.stmt.StatementExecutor.queryForAll(StatementExecutor.java:118)
            at com.j256.ormlite.dao.BaseDaoImpl.queryForAll(BaseDaoImpl.java:241)
            at be.appmax.twentebad.app.database.repositories.MenuRepository.getAll(MenuRepository.java:87)
            at be.appmax.twentebad.app.MainActivity.readDatabase(MainActivity.java:103)
            at be.appmax.twentebad.app.MainActivity.onCreate(MainActivity.java:65)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
            at android.app.ActivityThread.access$800(ActivityThread.java:145)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5144)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
            at dalvik.system.NativeStart.main(Native Method)
05-23 09:46:57.040 4613-4613/be.appmax.twentebad.app E/AndroidRuntime﹕ 致命异常:主
进程:be.appmax.twentebad.app,PID:4613
java.lang.RuntimeException:无法启动活动组件信息{be.appmax.twentebad.app/be.appmax.twentebad.app.MainActivity}:java.lang.RuntimeException:java.sql.SQLException:字段“images”列名的外部集合类be.appmax.twentebad.app.models.database.GalleryImage不包含类be.appmax.twentebad.app.models.database.Gallery的外部字段
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
在android.app.ActivityThread.access$800(ActivityThread.java:145)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:136)
位于android.app.ActivityThread.main(ActivityThread.java:5144)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:789)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.RuntimeException:java.sql.SQLException:字段“images”列名的外部集合类be.appmax.twentebad.app.models.database.GalleryImage不包含类be.appmax.twentebad.app.models.database.Gallery的外部字段
位于be.appmax.twentebad.app.database.DatabaseHelper.onCreate(DatabaseHelper.java:70)
位于com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.onCreate(OrmLiteSqliteOpenHelper.java:209)
位于android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
位于android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
位于com.j256.ormlite.android.AndroidConnectionSource.getReadWriteConnection(AndroidConnectionSource.java:66)
位于com.j256.ormlite.android.AndroidConnectionSource.getReadOnlyConnection(AndroidConnectionSource.java:54)
位于com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:243)
位于com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:196)
位于com.j256.ormlite.stmt.StatementExecutor.queryForAll(StatementExecutor.java:118)
位于com.j256.ormlite.dao.BaseDaoImpl.queryForAll(BaseDaoImpl.java:241)
位于be.appmax.twentebad.app.database.repositories.MenuRepository.getAll(MenuRepository.java:87)
位于be.appmax.twentebad.app.MainActivity.readDatabase(MainActivity.java:103)
位于be.appmax.twentebad.app.MainActivity.onCreate(MainActivity.java:65)
位于android.app.Activity.performCreate(Activity.java:5231)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
在android.app.ActivityThread.access$800(ActivityThread.java:145)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:136)
位于android.app.ActivityThread.main(ActivityThread.java:5144)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:789)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
在dalvik.system.NativeStart.main(本机方法)
原因:java.sql.SQLException:字段“images”列名的外部集合类be.appmax.twentebad.app.models.database.GalleryImage不包含类be.appmax.twentebad.app.models.database.Gallery的外部字段
位于com.j256.ormlite.field.FieldType.findForeignFieldType(FieldType.java:1020)
在com.j256.ormlite.field.FieldType.configDaoInformation上(FieldType.java:390)
位于com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:201)
位于com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:128)
位于com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:119)
位于com.j256.ormlite.dao.BaseDaoImpl$5。(BaseDaoImpl.java:921)
位于com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:921)
位于com.j256.ormlite.dao.DaoManager.doCreateDao(DaoManager.java:359)
位于com.j256.ormlite.dao.DaoManager.createDaoFromConfig(DaoManager.java:326)
位于com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:55)
在com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:218)上
位于com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:53)
位于be.appmax.twentebad.app.data
05-23 09:46:57.040    4613-4613/be.appmax.twentebad.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: be.appmax.twentebad.app, PID: 4613
    java.lang.RuntimeException: Unable to start activity ComponentInfo{be.appmax.twentebad.app/be.appmax.twentebad.app.MainActivity}: java.lang.RuntimeException: java.sql.SQLException: Foreign collection class be.appmax.twentebad.app.models.database.GalleryImage for field 'images' column-name does not contain a foreign field of class be.appmax.twentebad.app.models.database.Gallery
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2215)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
            at android.app.ActivityThread.access$800(ActivityThread.java:145)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5144)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.RuntimeException: java.sql.SQLException: Foreign collection class be.appmax.twentebad.app.models.database.GalleryImage for field 'images' column-name does not contain a foreign field of class be.appmax.twentebad.app.models.database.Gallery
            at be.appmax.twentebad.app.database.DatabaseHelper.onCreate(DatabaseHelper.java:70)
            at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.onCreate(OrmLiteSqliteOpenHelper.java:209)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
            at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
            at com.j256.ormlite.android.AndroidConnectionSource.getReadWriteConnection(AndroidConnectionSource.java:66)
            at com.j256.ormlite.android.AndroidConnectionSource.getReadOnlyConnection(AndroidConnectionSource.java:54)
            at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:243)
            at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:196)
            at com.j256.ormlite.stmt.StatementExecutor.queryForAll(StatementExecutor.java:118)
            at com.j256.ormlite.dao.BaseDaoImpl.queryForAll(BaseDaoImpl.java:241)
            at be.appmax.twentebad.app.database.repositories.MenuRepository.getAll(MenuRepository.java:87)
            at be.appmax.twentebad.app.MainActivity.readDatabase(MainActivity.java:103)
            at be.appmax.twentebad.app.MainActivity.onCreate(MainActivity.java:65)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
            at android.app.ActivityThread.access$800(ActivityThread.java:145)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5144)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.sql.SQLException: Foreign collection class be.appmax.twentebad.app.models.database.GalleryImage for field 'images' column-name does not contain a foreign field of class be.appmax.twentebad.app.models.database.Gallery
            at com.j256.ormlite.field.FieldType.findForeignFieldType(FieldType.java:1020)
            at com.j256.ormlite.field.FieldType.configDaoInformation(FieldType.java:390)
            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.doCreateDao(DaoManager.java:359)
            at com.j256.ormlite.dao.DaoManager.createDaoFromConfig(DaoManager.java:326)
            at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:55)
            at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:218)
            at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:53)
            at be.appmax.twentebad.app.database.DatabaseHelper.onCreate(DatabaseHelper.java:65)
            at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.onCreate(OrmLiteSqliteOpenHelper.java:209)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
            at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
            at com.j256.ormlite.android.AndroidConnectionSource.getReadWriteConnection(AndroidConnectionSource.java:66)
            at com.j256.ormlite.android.AndroidConnectionSource.getReadOnlyConnection(AndroidConnectionSource.java:54)
            at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:243)
            at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:196)
            at com.j256.ormlite.stmt.StatementExecutor.queryForAll(StatementExecutor.java:118)
            at com.j256.ormlite.dao.BaseDaoImpl.queryForAll(BaseDaoImpl.java:241)
            at be.appmax.twentebad.app.database.repositories.MenuRepository.getAll(MenuRepository.java:87)
            at be.appmax.twentebad.app.MainActivity.readDatabase(MainActivity.java:103)
            at be.appmax.twentebad.app.MainActivity.onCreate(MainActivity.java:65)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2265)
            at android.app.ActivityThread.access$800(ActivityThread.java:145)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5144)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
            at dalvik.system.NativeStart.main(Native Method)