2017-10-26 9 views
-1

私の質問を理解するには、プロジェクトの設計を説明する必要があります。我々は、3つの列を持つDBを持つ単純なMVPの概念を持っています。id name cost(int)DBHelperとModel Classesが使用され、RecyclerAdapterによってサポートされるListActivityと、DetailsActivity ListActivityの項目が選択されています。起動アクティビティMainActivityは、ユーザが多数のクエリを実行できるようにします。標準では、ListActivityからのコールの後にDBHelperに設定されたArrayList内のすべてのデータを表示します。ここで重要な部分は、DBHelperにdbList to ListActivity "return modelList"そこで、コスト列の値をSUMSし、その合計をMainActivityに戻す問合せを作成することにしました。 DBHelperは2つのRETURNステートメントにはまったく不満です。 DBHelperへの呼び出しはListActivityから行われるため、MainActivity NO Wayから直接呼び出しを行うことでこれを回避しようとしました。DBHelperは1つのRETURNステートメントを示しています。私の質問は、DBHelperから合計値を返す方法ですか?クエリが機能し、Mainから呼び出されたコードが下記に投稿されます。SQLiteヘルパークラスの2つのreturnステートメントが許可されていません

public 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; 
+0

**すべてのメソッド** ** 1のみ**の文を返さなければなりません! –

+0

@ModularSynthはい私はそれに同意しますが、2番目の方法はちょうど2つのうちの1つです。私たちはdbListを生成するメソッドには関与していません。コスト列はモデルにあります。なぜなら、DBHelperが不平を言っている理由です。 –

+1

'第2のメソッド'私は** one **メソッドしか見ることができません。 –

答えて

1

DBHelperクラスこのpublic 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; 
} 
1

OKこれは簡単ではありません。また、必要な手順についても説明します。私はあなたが新しいアイデアをテストするために周りを維持するかもしれないテストのためのシンプルなMVPデザインを持っています。まず、ここで

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

でメソッドを呼び出すMainActivityのコードがあるDBHelper

への旅行を作るためにDBHelperクラスNOのINTENTに呼び出しを行う活動で、このコードを追加する必要があります今

}

MainActivityが必要になりますランチャーですので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); 

} 

をバンドル意図でDBHelperのコードあなたがここでの意図で見ることができるように、その活動のバンドルを取得する問題がだから我々は、新しいアクティビティを作成しているのは

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)); 

が一部が求めることができるバンドルコードの検索である理由DBHelperが持っているためである奇数名contextXコンテキストの宣言だけで競合を回避しようとしました。また、totalPriceをMainActivityのpublic static Integer totalPriceとして宣言し、DBHelperにインポートしなければなりませんでした。

1

Grendelの回答は機能しますが、 DBHelperを使用してクエリを実行するのではなく、MainActivity内でクエリーを実行して、1つのリターンのみの問題に対処することにしました彼はDBHelper MainActivityで使用されるコードは、この設計の下に掲載されてMainActivity

import static com.<package_name>.DBHelper.TABLE_INFO; 

プライベートDBHelperヘルパーに戻っDBHelperをインポートする必要があり、 プライベートSQLiteDatabase db; ( "コストを合計" MainActivity.this、Toast.LENGTH_LONG)

ます。public void onSUM(ビュービュー){ Toast.makeText。show(); YES、彼らが働く最初の2つの答えを見て、両方の質問に対処していない、NORコメンテーターとあなたが本当に方法の構築をよく見てなかったいずれかの場合

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(); 

}

+0

これは良い練習であるかどうかわかりませんが、大したことではありません。誰かがDBHelperクラスの2つのリターンについてコメントしてくれたらうれしいです。良いところは、Androidは常にsomethng – Grendel

関連する問題