1

ここに示すのは、SQLite データベースの列に値を挿入するためのメソッドです。これほど多くの列を持つデータベースを使用したことはありません。このデータベースには 15 以上のテーブルがあります。私がデータベースを設計したのではなく、他の誰かが設計しました。

可能であれば、この Android メソッドをリファクタリングして、より適切に、またはより冗長にする方法を教えてください。すべての引数が 1 つの型ではなく、String、Float、および整数。

したがって、これにはカスタム Java 関数を作成する必要がありますが、それは努力する価値があるようには見えません。15 のカスタム オブジェクトを必要とする 15 の異なるテーブルがあります。

一般的な知識のいくつかは、メソッド内の引数が 4 または 5 よりも多すぎることを示唆しています。なぜそれが一般的に受け入れられている考え方なのかはわかりません。それが本当なら、私のJavaメソッドは本当に悪いヘアカットを必要としています. またはさらに悪い浣腸。

何か案は?

  public void insertNewRowInspectionPlan(int testOneInput, String testTwoInput,
 int testThreeInput, float testFourInput, int TestFiveInput, int testSixInput,
 int testSevenInput,  int testEightInput, int TestNineInput, float testTenInput,
 int testElevenInput, String testTwelveInput){
                  ContentValues contentValues = new ContentValues();
                  contentValues.put(COLUMN_1, testOneInput);
                  contentValues.put(COLUMN_2, testTwoInput);
                  contentValues.put(COLUMN_3, testTheeInput);
                  contentValues.put(COLUMN_4, testFourInput);
                  contentValues.put(COLUMN_5, testFiveInput);
                  contentValues.put(COLUMN_6, testSixInput);
                  contentValues.put(COLUMN_7, testSevenInput);
                  contentValues.put(COLUMN_8, testEightInput);
                  contentValues.put(COLUMN_9, testNineInput);
                  contentValues.put(COLUMN_10, testTenInput);
                  contentValues.put(COLUMN_11, testElevenInput);
                  contentValues.put(COLUMN_12, testTwelveInput);
   sqLiteDatabase.insert(INSPECTION_PLAN_TRANSACTION, null, contentValues);
       }
4

3 に答える 3

1

get setメソッドを使用してテスト用のクラスを作成すると、関数にそれほど多くのパラメーターを渡す必要がなくなり、そのクラスの直接参照変数を渡すことができます

Example: 









public class PropertiesContacts {



    int _id;
    String _title;
    String _description ;

    public int getID(){
        return this._id;
    }


    public void setID(int id){
        this._id = id;
    }


    public String gettitle(){
        return this._title;
    }


    public void settitle(String title){
        this._title = title;
    }



    public String getdescription (){
        return this._description ;
    }


    public void setdescription (String description ){
        this._description  = description ;
    }


}



Set properties value in activity
Like

PropertiesContacts  obj=new PropertiesContacts ();
obj._id=1;
obj._title ="amit";
obj._description ="test";
insertNewRowInspectionPlan(obj);
Hope you will understan 
于 2013-07-18T08:12:21.230 に答える
1

インスタンス変数がテーブルの構造を反映するクラスを作成することを検討できます。15 個のメソッド パラメータを渡す代わりに、テーブルの 1 行を表す Java オブジェクトを渡すだけです。したがって、テーブルが と呼ばれていると想像してInspectionPlanください。メソッドは大まかに次のようになります。

public void insertNewRowInspectionPlan(InspectionPlan inspectionPlan) {
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_1, inspectionPlan.getTestOneInput());
    // So on, so forth
    sqLiteDatabase.insert(INSPECTION_PLAN_TRANSACTION, null, contentValues);
}

InspectionPlanJavaオブジェクトからオブジェクトに各列を手動でコピーする必要があるため、これはまだかなりの作業ですContentValues。ある種のORM (Object-Relational Mapping)を使用することで、それを回避することもできます。Android ではOrmLiteを検討できますが、他のオプションもあるかもしれません。

于 2013-07-18T08:12:32.933 に答える
1

この種のコードを扱うとき、これらのパラメータを別のクラスとして抽出し、そのクラスでContentValuesデータ構造を返すメソッドを提供します。何かのようなもの:

public class DaoDataClass {
    private int testOneInput, testThreeInput, TestFiveInput, testSixInput, testSevenInput, testEightInput, TestNineInput, testElevenInput;
    private float testFourInput, testTenInput;
    private String testTwoInput, testTwelveInput;

    public ContentValues getContentValues() {
        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_1, testOneInput);
        contentValues.put(COLUMN_2, testTwoInput);
        contentValues.put(COLUMN_3, testTheeInput);
        contentValues.put(COLUMN_4, testFourInput);
        contentValues.put(COLUMN_5, testFiveInput);
        contentValues.put(COLUMN_6, testSixInput);
        contentValues.put(COLUMN_7, testSevenInput);
        contentValues.put(COLUMN_8, testEightInput);
        contentValues.put(COLUMN_9, testNineInput);
        contentValues.put(COLUMN_10, testTenInput);
        contentValues.put(COLUMN_11, testElevenInput);
        contentValues.put(COLUMN_12, testTwelveInput);
        return contentValues;
    }

    /**
     * Getters and setters below
     * */
}

これで、SQLite 永続性を呼び出す人は誰でも最初にDaoDataClassオブジェクトを作成し、コードは次のように変換されます。

public void insertNewRowInspectionPlan(DaoDataClass dataObject) {
    ContentValues contentValues = dataObject.getContentValues();
    sqLiteDatabase.insert(INSPECTION_PLAN_TRANSACTION, null, contentValues);
}
于 2013-07-18T08:13:18.920 に答える