Android 使用RxJava将复杂对象保存到数据库

Android 使用RxJava将复杂对象保存到数据库,android,sqlite,android-sqlite,rx-java,Android,Sqlite,Android Sqlite,Rx Java,我有一个向第三方API发出请求的应用程序,需要将大部分数据保存到本地Sqlite数据库(其中本地主键是自动递增的) 这些请求返回一个JSON响应,该响应通常包含许多嵌套对象,在本例中,我需要映射和保存这些对象,然后将记录链接回原始父对象ObjectA 该应用程序由RxJava驱动;我对这方面还不太熟悉。(通过StorIO的网络和持久性都是被动的)。我能够设置方法来批量保存父对象A,这很好。但是,当我开始使用Observable.from迭代这些对象时,我遇到了一些问题,随后保存嵌套的子对象,收集

我有一个向第三方API发出请求的应用程序,需要将大部分数据保存到本地Sqlite数据库(其中本地主键是自动递增的)

这些请求返回一个JSON响应,该响应通常包含许多嵌套对象,在本例中,我需要映射和保存这些对象,然后将记录链接回原始父对象ObjectA

该应用程序由RxJava驱动;我对这方面还不太熟悉。(通过StorIO的网络和持久性都是被动的)。我能够设置方法来批量保存父对象A,这很好。但是,当我开始使用Observable.from迭代这些对象时,我遇到了一些问题,随后保存嵌套的子对象,收集这些记录,并更新它们各自父项中的外键(对于多个子项使用Observable.zip)。通常会执行该函数(根据我的日志),但不知何故,结果不会通过链的其余部分提交回来,因此我不确定是否出现了问题,或者我的方法/实现是否存在问题

任何关于如何做到这一点的帮助或指点都将不胜感激

编辑添加的一些示例psudeo代码

/*this flatmap is attached to a network request that returns 
the previously defined JSON response*/

.flatMap(new Func1<List<ObjectAResponse>, Observable<List<ObjectAResponse>>>() {
        @Override
        public Observable<List<ObjectAResponse>> call(final List<ObjectAResponse> objectAResponse) {

            return saveObjectAListToDb(someOtherKey, objectAJsonResponses)                            
            .map(new Func1<PutResults<ObjectAEntity>, List<ObjectAResponse>>() {
                @Override
                public List<ObjectAResponse> call(PutResults<ObjectAEntity> putResults) {
                //Returning the original response to get the nested values
                return objectAResponse;
            }
        });
    }
})
.flatMap(new Func1<List<ObjectAResponse>, Observable<ObjectAResponse>>() {
            @Override
            public Observable<ObjectAResponse> call(List<ObjectAResponse> objectAResponse) {
                //Start emitting individual 'ObjectA' items to process its child items
                return Observable.from(objectAResponse);
            }
        })
.flatMap(new Func1<ObjectAResponse, Observable<ObjectAEntity>>() {
                @Override
                public Observable<ObjectAEntity> call(ObjectAResponse objectAResponse) {
                    /*Saving the individual nested objects in separate functions that return an observable that contains
                    * the resultant entity to be updated in to the main ObjectA entity
                    * (in reality there could be more nested child objects to save in parallel)
                    */
                    return Observable.zip(saveEpic(objectAResponse.nestedObjectB), saveUser(objectAResponse.nestedObjectCArray), 
                        new Func2<ObjectBEntity, ObjectCEntity, ObjectAEntity>() {

                        @Override
                        public Object call(ObjectBEntity objectBEntity, ObjectCEntity objectCEntity) {
                            //Function that updates the initial object with the new entities
                            return updateObjectA(objectAResponse.id, objectBEntity, objectCEntity);
                        }
                    });
                }
            })
.collect(new Func0<List<ObjectAEntity>>() {
                @Override
                public List<ObjectAEntity> call() {
                    return new ArrayList<ObjectAEntity>();
                }
            },
            new Action2<List<ObjectAEntity>, ObjectAEntity>() {
                @Override
                public void call(List<ObjectAEntity> objectAEntityList, ObjectAEntity o) {
                    //Collect the resultant updated entities and return the list
                    objectAEntityList.add(o);
                }
            });
/*此平面图附加到返回的网络请求
先前定义的JSON响应*/
.flatMap(新函数1(){
@凌驾
公共可观察调用(最终列表对象应答){
返回saveObjectAListToDb(someOtherKey,objectAJsonResponses)
.map(新函数1(){
@凌驾
公共列表调用(PutResults PutResults){
//返回原始响应以获取嵌套值
返回对象应答;
}
});
}
})
.flatMap(新函数1(){
@凌驾
公共可观察调用(列表对象响应){
//开始发出单个“ObjectA”项以处理其子项
可观察的返回。来自(ObjectarResponse);
}
})
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(ObjectAResponse ObjectAResponse){
/*将单个嵌套对象保存在返回包含
*要更新到主ObjectA实体的结果实体
*(实际上,可能有更多嵌套的子对象需要并行保存)
*/
返回Observable.zip(saveEpic(objectAResponse.nestedObjectB),saveUser(objectAResponse.nestedObjectCArray),
新功能2(){
@凌驾
公共对象调用(ObjectBenty ObjectBenty,ObjectCEntity ObjectCEntity){
//使用新实体更新初始对象的函数
返回updateObjectA(objectarResponse.id、objectbenty、objectCEntity);
}
});
}
})
.collect(新函数0(){
@凌驾
公共列表调用(){
返回新的ArrayList();
}
},
新行动2(){
@凌驾
公共作废调用(列表objectAEntityList,ObjectaEntityO){
//收集结果更新的实体并返回列表
objectAEntityList.add(o);
}
});

如果没有代码,很难说……我想你可以看看他们支持rx的领域,我正在使用它,并且工作得很好。@njzk2将使用一些示例代码进行更新,以帮助澄清没有代码的情况,很难说……我想你可以看看他们支持rx的领域,我正在使用它,并且工作得很好。@njzk2将用一些示例代码更新以帮助澄清
/*this flatmap is attached to a network request that returns 
the previously defined JSON response*/

.flatMap(new Func1<List<ObjectAResponse>, Observable<List<ObjectAResponse>>>() {
        @Override
        public Observable<List<ObjectAResponse>> call(final List<ObjectAResponse> objectAResponse) {

            return saveObjectAListToDb(someOtherKey, objectAJsonResponses)                            
            .map(new Func1<PutResults<ObjectAEntity>, List<ObjectAResponse>>() {
                @Override
                public List<ObjectAResponse> call(PutResults<ObjectAEntity> putResults) {
                //Returning the original response to get the nested values
                return objectAResponse;
            }
        });
    }
})
.flatMap(new Func1<List<ObjectAResponse>, Observable<ObjectAResponse>>() {
            @Override
            public Observable<ObjectAResponse> call(List<ObjectAResponse> objectAResponse) {
                //Start emitting individual 'ObjectA' items to process its child items
                return Observable.from(objectAResponse);
            }
        })
.flatMap(new Func1<ObjectAResponse, Observable<ObjectAEntity>>() {
                @Override
                public Observable<ObjectAEntity> call(ObjectAResponse objectAResponse) {
                    /*Saving the individual nested objects in separate functions that return an observable that contains
                    * the resultant entity to be updated in to the main ObjectA entity
                    * (in reality there could be more nested child objects to save in parallel)
                    */
                    return Observable.zip(saveEpic(objectAResponse.nestedObjectB), saveUser(objectAResponse.nestedObjectCArray), 
                        new Func2<ObjectBEntity, ObjectCEntity, ObjectAEntity>() {

                        @Override
                        public Object call(ObjectBEntity objectBEntity, ObjectCEntity objectCEntity) {
                            //Function that updates the initial object with the new entities
                            return updateObjectA(objectAResponse.id, objectBEntity, objectCEntity);
                        }
                    });
                }
            })
.collect(new Func0<List<ObjectAEntity>>() {
                @Override
                public List<ObjectAEntity> call() {
                    return new ArrayList<ObjectAEntity>();
                }
            },
            new Action2<List<ObjectAEntity>, ObjectAEntity>() {
                @Override
                public void call(List<ObjectAEntity> objectAEntityList, ObjectAEntity o) {
                    //Collect the resultant updated entities and return the list
                    objectAEntityList.add(o);
                }
            });