不允许在SQLite帮助程序类中使用两个return语句

时间:2017-10-26 16:39:49

标签: android sqlite return android-sqlite

要理解我的问题,我们需要解释项目设计。我们有一个简单的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>

3 个答案:

答案 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;
}