2014-02-18 34 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

相关问题