Android 将复杂对象及其子实体保存到Lite

Android 将复杂对象及其子实体保存到Lite,android,database,sqlite,ormlite,foreign-collection,Android,Database,Sqlite,Ormlite,Foreign Collection,我在一个项目中使用ORMLite,我决定使用该工具使Web服务的持久化部分只需一次,就可以在Android上重用它 但是我很痛苦,因为有很多复杂的物体,有多个外来的收集场和外来的物体,在Persistir temenda的时候,这些数据令人头痛,因为我必须一个接一个地输入他们的孩子,我想​​ORM让生活变得更轻松(你必须坚持目标和父亲,其余的都是在幕后完成的) 好吧,现在放弃lite ORM已经太晚了,我想知道是否有办法实现上面提到的sitei 我找到了一段代码 试图实现,但似乎不起作用,只是一

我在一个项目中使用ORMLite,我决定使用该工具使Web服务的持久化部分只需一次,就可以在Android上重用它

但是我很痛苦,因为有很多复杂的物体,有多个外来的收集场和外来的物体,在Persistir temenda的时候,这些数据令人头痛,因为我必须一个接一个地输入他们的孩子,我想​​ORM让生活变得更轻松(你必须坚持目标和父亲,其余的都是在幕后完成的)

好吧,现在放弃lite ORM已经太晚了,我想知道是否有办法实现上面提到的sitei

我找到了一段代码

试图实现,但似乎不起作用,只是一直保存父对象

遵循我尝试使用的函数,但不知道导入是否正确,因为我在上面的链接中找到的代码没有此数据

public int create(Object entity, Context context) throws IllegalArgumentException, IllegalAccessException, SQLException, SQLException {
    try{
        if (entity!=null){
            // Class type of entity used for reflection
            Class clazz = entity.getClass();

            // Search declared fields and save child entities before saving parent.
            for(Field field : clazz.getDeclaredFields()) {
                field.setAccessible(true);
                // Inspect annotations
                Annotation[] annotations = field.getDeclaredAnnotations();
                try{
                    for(Annotation annotation : annotations) {
                        // Only consider fields with the DatabaseField annotation
                        if(annotation instanceof DatabaseField) {
                            // Check for foreign attribute
                            DatabaseField databaseField = (DatabaseField)annotation;
                            if(databaseField.foreign()) {
                                // Check for instance of Entity
                                Object object = field.get(entity);

                                Dao gDao = getDatabase(context).getDao(object.getClass());
                                gDao.create(object);
                            }
                        }else if (annotation instanceof ForeignCollectionField){
                            Object object = field.get(entity);
                            for(Object obj : new ArrayList<Object>((Collection<?>)object)){
                                Class c = obj.getClass();

                                Dao gDao = getDatabase(context).getDao(obj.getClass());
                                gDao.create(obj);
                            }
                        }
                    }
                }catch (NullPointerException e){
                    e.printStackTrace();
                }
            }

            // Retrieve the common DAO for the entity class
            Dao dao =  getDatabase(context).getDao(entity.getClass());

            // Persist the entity to the database
            return dao.create(entity);
        }else
            return 0;
    }finally {
        if (database != null) {
            OpenHelperManager.releaseHelper();
            database = null;
        }
    }
}
public int create(对象实体、上下文上下文)抛出IllegalArgumentException、IllegalAccessException、SQLException、SQLException{
试一试{
如果(实体!=null){
//用于反射的实体的类类型
Class clazz=entity.getClass();
//在保存父实体之前,搜索声明的字段并保存子实体。
for(字段:clazz.getDeclaredFields()){
字段。setAccessible(true);
//检查注释
Annotation[]annotations=field.getDeclaredAnnotations();
试一试{
用于(注释:注释){
/只考虑数据库字段注释的字段
if(数据库字段的注释实例){
//检查外部属性
DatabaseField DatabaseField=(DatabaseField)注释;
if(databaseField.foreign()){
//检查实体的实例
Object=field.get(实体);
Dao gDao=getDatabase(context.getDao(object.getClass());
创建(对象);
}
}else if(ForeignCollectionField的注释实例){
Object=field.get(实体);
对于(对象对象:新ArrayList((集合)对象)){
c类=obj.getClass();
Dao gDao=getDatabase(context.getDao(obj.getClass());
gDao.create(obj);
}
}
}
}捕获(NullPointerException e){
e、 printStackTrace();
}
}
//检索实体类的公共DAO
Dao=getDatabase(context.getDao(entity.getClass());
//将实体持久化到数据库
返回dao.create(实体);
}否则
返回0;
}最后{
if(数据库!=null){
OpenHelperManager.releaseHelper();
数据库=null;
}
}
}
利用相同的帖子,还需要一个colução来删除cascade,想象一下我有以下表格的情况:

公司>类别>人员>联系人>电话和电子邮件

删除,现在我按照文档中的描述执行:

public int deleteCascade(Prefeitura prefeitura, Context context){
        try{
            Dao<Prefeitura, Integer> dao = getDatabase(context).getDao(Prefeitura.class);
            DeleteBuilder db = dao.deleteBuilder();
            db.where().eq("prefeitura_id", prefeitura.getId());
            dao.delete(db.prepare());
            // then call the super to delete the city
            return dao.delete(prefeitura);


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

        return 0;
    }
public int deleteCascade(prefetura prefetura,Context-Context){
试一试{
Dao=getDatabase(context).getDao(prefetura.class);
DeleteBuilder db=dao.DeleteBuilder();
db.where().eq(“prefetura_id”,prefetura.getId());
dao.delete(db.prepare());
//然后调用super删除该城市
返回dao.delete(prefetura);
}捕获(SQLE异常){
e、 printStackTrace();
}
返回0;
}
但是那些与公司没有直接联系的对象仍然在数据库中,我该怎么办

但是没有黑客,我想要一个干净的代码

我知道ORM Lite确实是Lite,但是保存孩子的创建和删除级联对于任何ORM来说都是必不可少的,希望在下一个版本中实现它,遗憾的是没有这些功能,对于简单的项目来说是非常好的,但是在复杂的项目中,因为有很多头痛的事情,我感到很不舒服


欢迎任何帮助

抱歉,我现在没有正确解决这个问题的周期。也许把它贴在android邮件列表上?好的,它已经发布了,但是你知道如何解决删除问题吗?对父对象及其子对象的清晰感觉形成。。。