要理解我的问题,我们需要解释项目设计。我们有一个简单的MVP概念,数据库有3列id名称成本(int)使用DBHelper和Model Classes以及由RecyclerAdapter支持的ListActivity以及显示数据库中所有元素的DetailsActivity选择ListActivity中的项目。启动活动MainActivity将允许用户运行多个查询标准公平显示在ListActivity调用之后填充在DBHelper中的ArrayList中的所有数据这里是DBHelper将此语句发送回dbList的重要部分到ListActivity“return modelList”所以我们决定创建一个查询,使SUMS成为cost列中的值,并将总和返回给MainActivity。 DBHelper对TWO RETURN语句非常不满意。因为对DBHelper的调用是从ListActivity进行的,所以我们试图通过MainActivity直接调用来绕过它.NO Way DBHelper说一个RETURN语句。我的问题是如何从DBHelper返回总和值?查询有效,我们将发布从Main下面调用的代码。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<a>
<li>
<span>Menu</span>
<span><i class="icon"></i></span>
<ul>
<a><li>Sub menu1</li></a>
<a><li>Sub menu1</li></a>
</ul>
</li>
</a>
<a>
<li>Other Menu</li>
</a>
<a>
<li>Other Menu</li>
</a>
<a>
<li>Other Menu</li>
</a>
<a>
<li>
<span>Menu</span>
<span><i class="icon"></i></span>
<ul>
<a><li>Sub menu1</li></a>
<a><li>Sub menu1</li></a>
</ul>
</li>
</a>
</ul>
答案 0 :(得分:1)
好的,这不容易也不简单我会尝试解释所需的步骤。我有一个简单的MVP设计用于测试,你可以保留一个用于测试新想法。首先,您需要在调用DBHelper类NO INTENT的Activity中添加此代码,以便访问DBHelper
以下是MainActivity中调用DBHelper
中的方法的代码static Context contextX;
contextX = this.getBaseContext();
public void onSUM(View view){
Toast.makeText( MainActivity.this, "Sum the Cost", Toast.LENGTH_LONG
).show();
helper = new DBHelper(this);
helper.sumALL();
}
现在DBHelper中的代码与Intent捆绑了totalPrice
public void sumALL(){
Cursor cursorA =null;
db = this.getWritableDatabase();
String q = "SELECT SUM(cost) FROM " + TABLE_INFO;
cursorA = db.rawQuery(q,null);
if(cursorA.moveToFirst()){
totalPrice = cursorA.getInt(0);
}
cursorA.close();
db.close();
//return totalPrice;
Bundle extrasB = new Bundle();
extrasB.putInt("BACK",totalPrice);
contextX = MainActivity.contextX;
Intent intentB = new Intent(contextX,ShowTotalActivity.class);
intentB.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// required to use intent in non Activity Class
intentB.putExtras(extrasB);
contextX.startActivity(intentB);
}
因为MainActivity是启动器,所以在该活动中检索包时会遇到问题所以我们创建了一个新的Activity,你可以在Intent中看到这里是包代码的检索
Context contextX;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_total);
etTotal =(EditText)findViewById(R.id.etTotal);
btnBack = (Button)findViewById(R.id.btnBack);
Intent intentB = getIntent();
Bundle extrasB = intentB.getExtras();
int costB = extrasB.getInt("BACK");
DecimalFormat df = new DecimalFormat("#.00"); // Set your desired format
String dollarSIGN = df.format(costB/100.0);
etTotal.setText(String.valueOf("Total of Gas $"+dollarSIGN));
有些人可能会问为什么奇怪的名称contextX是因为DBHelper有一个上下文声明只是为了避免冲突我们还必须将totalPrice声明为 main static中的public static Integer totalPrice并将其导入DBHelper
答案 1 :(得分:1)
虽然Grendel的答案可行,但由于继承设计,它需要更多代码并且看起来很困难我们决定不使用DBHelper来运行查询,而是在MainActivity中执行查询以处理只有一个返回的问题在DBHelper中,MainActivity中使用的代码发布在下面。此设计需要将DBHelper导回MainActivity
import static com.<package_name>.DBHelper.TABLE_INFO;
私人DBHelper助手; 私有SQLiteDatabase db;
public void onSUM(View view){ Toast.makeText(MainActivity.this,&#34; Sum the Cost&#34;,Toast.LENGTH_LONG).show();
Cursor cursor =null;
helper = new DBHelper(this);
db = helper.getWritableDatabase();
String q = "SELECT SUM(cost) FROM " + TABLE_INFO;
cursor = db.rawQuery(q,null);
if(cursor.moveToFirst()){
totalPrice = cursor.getInt(0);
}
DecimalFormat df = new DecimalFormat("#.00");
String dollarSIGN = df.format(totalPrice/100.0);
etTotoal.setText(String.valueOf("Total of Gas $"+dollarSIGN));
cursor.close();
db.close();
}
答案 2 :(得分:1)
对于任何看过前两个答案的人来说,YES是有效的,两者都没有解决问题,评论员和你的真正关注的是DBHelper Class中方法的构造,这个公共sumALL(){ 如此错误它应该是public int sumALL(){因此将发布来自MainActivity代码的调用,并且将发布正确构建的DBHelper的sumALL方法
从MainActivity调用代码
helper = new DBHelper(this);
helper.summALL();
etLineTwo.setText(String.valueOf(totalPrice));
DecimalFormat df = new DecimalFormat("#.00"); // Set your desired format here.
String dollarSIGN = df.format(totalPrice/100.0);
etLineTwo.setText(String.valueOf("of Gas $"+dollarSIGN));
带有返回的DBHelper方法的代码
public int summALL(){
Cursor cursor = null;
db = this.getWritableDatabase();
String query = "SELECT SUM(cost) FROM " + TABLE_INFO;
cursor = db.rawQuery(query,null);
if(cursor.moveToFirst()){
totalPrice = cursor.getInt(0);
}
db.close();
cursor.close();
return totalPrice;
}