1

这里显示的是一种用于将值插入 SQLite 数据库的列的方法。我以前从未使用过包含这么多列的数据库。该数据库中有超过 15 个表。数据库不是我设计的,是别人设计的。

如果可能的话,我如何重构这个 android 方法以使其更好或更简洁,看起来我不能使用像 ArrayList 这样的集合对象,因为所有参数都不是一种类型,有多种类型,如 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

您可以考虑创建一个实例变量反映表结构的类。您只需传递代表表中一行的 Java 对象,而不是传递 15 个方法参数。因此,假设该表被调用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);
}

这仍然是相当多的工作,因为您必须手动将每一列从 JavaInspectionPlan对象复制到该ContentValues对象。甚至可以通过使用某种ORM(对象关系映射)来避免这种情况。在 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 回答