0

在升级我的数据库架构时,我遇到了 ForeignCollectionField (ormlite 4.7) 不返回行的问题。通过全新安装应用程序,可以按预期添加和显示行。

当应用程序更新到新版本时,架构会更新(见下文),但是当将行添加到数据库时,集合不会返回添加的行。(我可以看到数据库中存在这些行)

父行在更新之前存在。我需要做什么来修复它?

定义了外部集合的父类

@DatabaseTable(tableName = "setting")
public class SettingEntity {

    @DatabaseField(generatedId = true)
    private long id;

    …

    //New field added
    @ForeignCollectionField
    private ForeignCollection<DistributionEntity> distribution;

    public SettingEntity() {
        // Required for ORMLite
    }

    public ForeignCollection<DistributionEntity> getDistribution() {
        return distribution;
    }

    public void setDistribution(ForeignCollection<DistributionEntity> distribution) {
        this.distribution = distribution;
    }
}

儿童班

@DatabaseTable(tableName = "distribution")
public class DistributionEntity {

    @DatabaseField(generatedId = true)
    private long id;
    …
    //New field added
    @DatabaseField(canBeNull = true, foreign = true, index = true, foreignAutoRefresh = true, columnDefinition = "integer references setting(id) on delete cascade")
    private SettingEntity setting;

    public void setSetting(SettingEntity setting) {

        this.setting = setting;
     }
 }

onUpgrade 代码

RuntimeExceptionDao<DistributionEntity, Integer> distributionDao = helper.getDistributionDao();
distributionDao.executeRaw("ALTER TABLE distribution ADD setting_id");
distributionDao.executeRaw("CREATE INDEX distribution_setting_idx ON distribution (setting_id)");

ForeignCollectionField 调用分布的调试信息

在此处输入图像描述

遍历集合的代码

public ArrayList<Distribution> getDistribution() {
    getEntity().getDistribution().size();
    final ArrayList<Distribution> items = new ArrayList<Distribution>();
    final ForeignCollection<DistributionEntity> collection = getEntity().getDistribution();
    for (final DistributionEntity item : collection) {
        final Distribution dist = new Distribution(item, mContext);
        items.add(dist);
    }
    return items;
 }

注意 getEntity() 返回 SettingEntity 的实例

感谢您花时间

4

1 回答 1

0

比答案更多的解决方法,但必须解决这个问题。通过编写代码复制行为。

public List<DistributionEntity> getDistribution() {

    List<DistributionEntity> distributionEntities = new ArrayList<DistributionEntity>();

    try {
        DatabaseHelper helper = DatabaseHelper.getInstance();
        RuntimeExceptionDao<DistributionEntity, Integer> dao = helper.getDistributionDao();

        QueryBuilder<DistributionEntity, Integer> queryBuilder = dao.queryBuilder();
        queryBuilder.where().eq(DistributionEntity.SETTING_FIELD_NAME, Long.toString(this.getId()));
        PreparedQuery<DistributionEntity> preparedQuery = queryBuilder.prepare();
        distributionEntities = dao.query(preparedQuery);

    } catch (SQLException e) {
        e.printStackTrace();
    }

    return distributionEntities;
    //return distribution;
}

喜欢知道真正的答案是什么

于 2013-10-18T03:35:35.363 回答