2014-02-18 70 views
1

我有一個使用本地數據庫功能的iOS應用程序。我不使用CoreData;我將我的sqlite文件從資源包複製到Documents文件夾,然後更新/從該文件中提取數據。 所有的更新,創建表,插入算法在我的應用程序中工作得很好。避免在更新ios中的本地數據庫時進行硬編碼

我只是想改善。我有超過7個表,每個表都有不同的屬性。現在,我有我的代碼,以指定的每個更新語句,像(只是一個例子):

// for table A 
    const char* sql = "update tableA Set attA1 = ?, attA2 = ? where att0 = ?"; 

    // .. other code here ... 

    // bind it - this is the part where i am confused. 
    // each table has different attribute.. So each table will have each binding snippet? 
    if(sqlite3_prepare_v2(database, sql, 267, &stmt, NULL)==SQLITE_OK){ 
     sqlite3_bind_text(stmt, 1, [input1 UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 2, [input2 UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_int(stmt, 3, input0); 
    } 

道歉,如果這聽起來像初學者的問題。是否有可能避免這樣的「硬編碼」?我沒有找到避免硬編碼的方法,但我只是好奇,如果有人有一些見解。 我發現的最接近的帖子是this - 他的情況很好。 我看過很多iOS的sqlite數據庫教程,其中大部分都是這樣做的,因爲他們的例子中只有1個表。

我還在學習,所以請不要太苛刻,如果這是一個明顯的/壞的問題。 :)

+0

你可以使用類似FMDB的東西,或者你可以動態地構建自己的SQL語句。它需要一些規劃和相當數量的編碼才能生成一個「框架」,但它通常是值得的。 –

回答

0

您可能可以通過使用使用Objective C概念而不是原始C的幫助程序庫來移除樣板代碼;在SQLite的情況下,如FMDB

當您發現您重複編寫相同的代碼時,應該將常用代碼分解爲輔助函數(/ class/etc。一些被稱爲像這樣:

update_table_record(database, @"tableA", 
        @{ @"att0" : input0 }, // record ID 
        @{ @"attA1" : input1, // new values 
         @"attA2" : input2 }); 

如果你的表記錄對應於你的程序的對象,你可能會考慮使用ORM,如chibi-ORMsqlitepersistentobjects

相關問題