在ios中更新本地数据库时避免使用硬编码

时间:2014-02-18 09:52:58

标签: ios sqlite

我有一个使用本地数据库功能的iOS应用程序。我不使用CoreData;我将我的sqlite文件从资源包复制到Documents文件夹,然后从该文件更新/拉取数据。 所有的更新,创建表,插入算法在我的应用程序中完美运行。

我只是想知道改进。我有超过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个表。

我还在学习,如果这是一个明显/糟糕的问题,请不要对我太苛刻。 :)

1 个答案:

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