SQLite插入函数/方法参数参数太多,如何重构?

时间:2013-07-18 08:02:53

标签: java android database sqlite

这里显示的是一个用于将值插入SQLite数据库的列的方法。 我之前从未使用过这么多列的数据库。此数据库中有超过15个表。我没有设计数据库,其他人也没有。

如果可能的话,我如何重构这个android方法以使其更好或更简洁,看起来我不能使用像ArrayList这样的集合对象,因为所有的参数都不是一种类型,有多种类型如String,浮点数和int。

所以这需要制作一个自定义的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);
       }

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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);
}

这仍然是相当多的工作,因为您手动必须将每个列从Java InspectionPlan对象复制到ContentValues对象。通过使用某种ORM (Object-Relational Mapping)可以避免这种情况。在Android上,您可以考虑OrmLite,但也可能有其他选项。

答案 2 :(得分: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);
}