2017-01-31 19 views
0

我們發現很多關於sqlite的教程,使用常量來管理sqlite文件方法中的請求......但這是一個好方法嗎? Immagine我們重命名一個數據庫的三倍列,我們將有三次使用不同名稱的同一個常量。在sqlite版本中使用常量

那麼最佳實踐是什麼?至於我自己,我寫的版本那樣:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    if (oldVersion < 4) { 
     db.execSQL("ALTER TABLE " + "demandes" + " RENAME TO demandes2"); 
     db.execSQL("CREATE TABLE " + "demandes" + "(" + "id" + " INTEGER PRIMARY KEY," + "xmlSendLead" + " TEXT," + "statutEnvoieSendLead" + " INTEGER," + "dateEnvoieSendLead" + " DATETIME," + "contactWebId" + " INTEGER," + "xmlSimulation" + " TEXT," + "statutEnvoieSimulation" + " INTEGER," + "dateEnvoieSimulation" + " DATETIME" + ")"); 
     db.execSQL("INSERT INTO " + "demandes" + " (" + "id" + "," + "xmlSendLead" + "," + "statutEnvoieSendLead" + "," + "dateEnvoieSendLead" + ")" + " SELECT id, xml, statutEnvoie, dateEnvoie" + " FROM demandes2;"); 
     db.execSQL("DROP TABLE demandes2"); 
     System.out.println("v4 parsed"); 
    } 
    if (oldVersion < 5) { 
     db.execSQL("CREATE TABLE " + "leads" + "(" + "id" + " INTEGER PRIMARY KEY," + "xmlSendLead" + " TEXT," + "statutSendLead" + " INTEGER," + "dateSendLead" + " DATETIME," + "contactWebId" + " INTEGER," + "xmlSimulation" + " TEXT," + "statutSendSimulation" + " INTEGER," + "dateSendSimulation" + " DATETIME" + ")"); 
     db.execSQL("INSERT INTO " + "leads" + " (" + "id" + "," + "xmlSendLead" + "," + "statutSendLead" + "," + "dateSendLead" + "contactWebId" + "," + "xmlSimulation" + "," + "statutSendSimulation" + "," + "dateSendSimulation" + ")" + " SELECT id, xml, statutEnvoie, dateEnvoie" + " FROM demandes2;"); 

     db.execSQL("CREATE TABLE " + "leads" + "(" + "id" + " INTEGER PRIMARY KEY," + "prepaymentPenaltyPercentage" + " REAL," + "notaryFeeGrid" + " INTEGER," + "immoRatePercentage" + " REAL," + "immoMinMonthly" + " INTEGER," + "immoMaxMonthly" + " INTEGER," + "fileFeePercentage" + " REAL," + "date" + " DATETIME," + "consoRatePercentage" + " REAL," + "consoMinMonthly" + " INTEGER," + "consoMaxMonthly" + " INTEGER," + "bankFeePercentage" + " REAL)"); 
    } 
} 

所以在這裏我不會做名之間的錯誤......因爲我使用常量的其他方法。你有什麼想法 ?

其他方法:

private static final int DATABASE_VERSION = 5; 
private static final String DATABASE_NAME = "solutis.db"; 
private static final String KEY_ID = "id"; 

private static final String TABLE_LEADS = "leads"; 
private static final String KEY_XML_SENDLEAD = "xmlSendLead"; 
private static final String KEY_STATUTENVOIE_SENDLEAD = "statutEnvoieSendLead"; 
private static final String KEY_DATEENVOIE_SENDLEAD = "dateEnvoieSendLead"; 
private static final String KEY_CONTACTWEBID = "contactWebId"; 
private static final String KEY_XML_SIMULATION = "xmlSimulation"; 
private static final String KEY_STATUTENVOIE_SIMULATION = "statutEnvoieSimulation"; 
private static final String KEY_DATEENVOIE_SIMULATION = "dateEnvoieSimulation"; 

private static final String TABLE_SIMULATIONPARAMS = "simulationParams"; 
private static final String KEY_BANKFEEPERCENTAGE = "bankFeePercentage"; 
private static final String KEY_CONSOMAXMONTHLY = "consoMaxMonthly"; 
private static final String KEY_CONSOMINMONTHLY = "consoMinMonthly"; 
private static final String KEY_CONSORATEPERCENTAGE = "consoRatePercentage"; 
private static final String KEY_FILEFEEPERCENTAGE = "fileFeePercentage"; 
private static final String KEY_IMMOMAXMONTHLY = "immoMaxMonthly"; 
private static final String KEY_IMMOMINMONTHLY = "immoMinMonthly"; 
private static final String KEY_IMMORATEPERCENTAGE = "immoRatePercentage"; 
private static final String KEY_PREPAYMENTPENALTYPERCENTAGE = "prepaymentPenaltyPercentage"; 
private static final String KEY_NOTARYFEEGRID = "notaryFeeGrid"; 
private static final String KEY_DATE = "date"; 


@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_DEMANDES_TABLE = "CREATE TABLE " + TABLE_LEADS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_XML_SENDLEAD + " TEXT," + KEY_STATUTENVOIE_SENDLEAD + " INTEGER," + KEY_DATEENVOIE_SENDLEAD + " DATETIME," + KEY_CONTACTWEBID + " INTEGER," + KEY_XML_SIMULATION + " TEXT," + KEY_STATUTENVOIE_SIMULATION + " INTEGER," + KEY_DATEENVOIE_SIMULATION + " DATETIME" + ")"; 

    db.execSQL(CREATE_DEMANDES_TABLE); 
    /* 
    String CREATE_DEMANDES_TABLE = "CREATE TABLE " + TABLE_LEADS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_XML_SENDLEAD + " TEXT," + KEY_STATUTENVOIE_SENDLEAD + " INTEGER," + KEY_DATEENVOIE_SENDLEAD + " DATETIME" + ")"; 
    db.execSQL(CREATE_DEMANDES_TABLE); 
    */ 
} 


public Demande addDemande(Demande demande) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_XML_SENDLEAD, demande.getXmlSendLead()); 
    values.put(KEY_STATUTENVOIE_SENDLEAD, demande.getStatutEnvoieSendLead()); 
    values.put(KEY_DATEENVOIE_SENDLEAD, demande.getDateEnvoieSendLead()); 
    values.put(KEY_CONTACTWEBID, demande.getContactWebId()); 
    values.put(KEY_XML_SIMULATION, demande.getXmlSimulation()); 
    values.put(KEY_STATUTENVOIE_SIMULATION, demande.getStatutEnvoieSimulation()); 
    values.put(KEY_DATEENVOIE_SIMULATION, demande.getDateEnvoieSimulation()); 
    //long test = db.insert(TABLE_LEADS, null, values); 
    //int test2 = (int) test; 
    //demande.setID(test2); 
    long insert = db.insert(TABLE_LEADS, null, values); 
    int insertDemande = (int) insert; 
    demande.setId(insertDemande); 
    db.close(); 
    return demande; 
} 
+1

'variable'使用適當的術語在IT中非常重要。你在這裏指的是「專欄」嗎?你的'execSQL()'查詢看起來也是無稽之談。爲什麼要連接字符串,而不是隻有一個? –

+0

@MarcinOrlowski對不起,我之前使用變量的字符串連接,但是當我多次改變列名時,我得到很多變量來管理 – Ben

+0

您在表中獲得了多少列? 10? 20?更好地使用常量,而不是手動輸入列名,因爲後者會在早些時候發現追逐愚蠢的錯字問題。 –

回答

0

當你直接寫表/列名到SQL語句時,你增加你拼錯它的地方的風險,而後來的應用程序將炸燬。 如果你使用常量,編譯器會抱怨任何錯誤。

所以一般來說,你應該總是使用常量。

但是,即使使用常量也不能防止意外地使用錯誤的。 所以你仍然需要測試你的所有代碼。

如果您認爲實際的表/列名稱比TABLE_THIS和KEY_THAT更具可讀性,並且您確信自己的測試能夠捕獲所有錯誤,那麼您可以決定不使用常量。而這個決定是不是一個好主意,你必須找出自己的想法。

+0

如何使用大型數據庫處理應用程序來管理它 – Ben