如何在不破坏Presenter的情况下将SQLite Cursor从MVP模型传递给View?

时间:2017-10-19 10:03:20

标签: android android-sqlite mvp android-cursor android-mvp

我有一个使用MVP设计的应用程序实现,我想使用SQLlite数据库将数据源提供给UI View。我不想/需要使用ContentProvider因为我的应用程序仅需要数据。

我知道View应该是“愚蠢的”,任何“商业”逻辑都应该放在PresenterModel中。但Presenter应该不包含Android代码,以便进行独立的单元测试。

那么,如果我不能在Model中使用Presenter,如何将View的SQLite数据传输回cursor,然后再传递Presenter MVP

我可以使用回调但是创建自己的数据结构的'正确'方法,将数据加载到那里然后在回调中传递列表?

我希望忠于Context设计。 我已经用Google搜索了这篇文章,虽然在处理Presenter中的<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:geonet="http://www.fao.org/geonetwork"> <xsl:output method="text" encoding="utf-8" /> <!-- identity templates walks tree and suppresses nodes with no template --> <xsl:template match="node()|@*"> <xsl:apply-templates select="node()|@*"/> </xsl:template> <!-- output only on nodes we select --> <xsl:template match="node()|@*" mode="output"> <xsl:copy> <xsl:apply-templates select="node()|@*" mode="output"/> </xsl:copy> </xsl:template> <xsl:template match="gmd:pointOfContact/gmd:CI_ResponsibleParty"> <xsl:choose> <xsl:when test="gmd:individualName/gco:CharacterString"> <xsl:text>Responsible: </xsl:text> <xsl:apply-templates mode="output"/> <xsl:text>;</xsl:text> </xsl:when> <xsl:otherwise>NO Responsible: ;</xsl:otherwise> </xsl:choose> </xsl:template> 时有很多东西,但使用其他Android数据结构并不是很多。

1 个答案:

答案 0 :(得分:0)

即使在演示者中,您也不应该在视图中访问SQLite。

对模型的所有访问都是在模型层中进行的,因此如果您需要从视图/演示者中与该光标进行交互,则必须创建调用它的方法:

从View调用presenter方法 - &gt;来自Presenter呼叫模型方法 - &gt;从模型调用它的光标交互方法。

反之亦然。

所以...你需要的应该是这样的:

查看某些需要某些数据的presenter方法(presenter.loadInfo(...)) - &gt; Presenter调用模型(UseCase,模型类等)[model.loadData(...)] - &gt; Model有一个属性或数据库网关,所以它要求一个查询,一旦它有de info,它就会返回到演示者。

预计它将是异步的,因此创建一个回调并从演示者调用它:

model.loadInfo(..., new onResponseCallback() {

method onResponse(MyResponseClass response) {

//Manage your response as you want
view.showData(...)

}

method onFailure(MyFailureClass failure) {
view.showFailure...
} 
});