我有一个使用本地数据库功能的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个表。
我还在学习,如果这是一个明显/糟糕的问题,请不要对我太苛刻。 :)
答案 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-ORM或sqlitepersistentobjects。