【发布时间】:2013-11-28 18:06:20
【问题描述】:
所以基本上我有一个应用程序,它将根据所选项目提供任务。项目和任务都存储在 SQLite 数据库中。
为了获取当前项目 ID,我将所选项目 (_selectedProject) 与我的数据库进行比较,以获取 ID。这是在我的 getSelectedProjectId 方法中完成的。但是,在 getTasks 方法中运行此方法时,Where 语句根本不起作用。如果我不先运行 getSelectedProjectId 方法,它就可以正常工作。我是不是忘记发布一些东西了?或者是别的什么?有任何想法吗?
我对 SQLite 和 Objective C 都很陌生,所以这可能不是一个复杂的问题。我已确保 getSelectedProjectId 方法返回正确的项目 ID。我还确保在 getTasks 方法中运行的查询是正确的,并且当通过我的终端运行它时,它会返回许多行。在应用程序中它什么也不返回,前提是我首先在该方法的某个地方运行 getSelectedProjectId。
这是获取任务的方法:
- (void)getTasks
{
[self openDB];
sqlite3_stmt *statement;
int projectId = [self getSelectedProjectId];
NSString *query = [NSString stringWithFormat:@"SELECT * FROM tasks WHERE project_id=%i", projectId];
const char *query_statement = [query UTF8String];
sqlite3_prepare_v2(_contactDB, query_statement, -1, &statement, NULL);
while (sqlite3_step(statement) == SQLITE_ROW)
{
// I add the task title to my array of tasks here.
}
sqlite3_finalize(statement);
sqlite3_close(_contactDB);
}
这是从数据库中获取正确项目 ID 的方法:
- (int)getSelectedProjectId
{
sqlite3_stmt *statement;
NSString *query = [[NSString alloc]
initWithFormat:@"SELECT id FROM projects WHERE title=\"%@\" LIMIT 0,1",
_selectedProject];
int rowId = 0;
const char *query_statement = [query UTF8String];
[self openDB];
sqlite3_prepare_v2(_contactDB, query_statement, -1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_ROW)
{
rowId = sqlite3_column_int(statement, 0);
}
sqlite3_finalize(statement);
sqlite3_close(_contactDB);
return rowId;
}
【问题讨论】:
-
当您调用 getSelectedProjectId 时,您将关闭数据库。 (为什么不直接打开数据库并让它保持打开状态?)
-
该死的好电话。原来是这个问题。谢谢! PS。我在某处读到,每次使用完数据库连接都应该关闭它。我假设是出于安全目的?
-
顺便说一句:不要在方法前面加上
get。此外,编写 SQLite 通常是浪费时间。使用 FMDB,或者,如果你只使用 iOS/OS X,最好使用 Core Data,这样你就可以利用它提供的所有优化和功能。 -
我已经在商业 iPhone 应用程序中使用 SQLite 4 年了。我们总是让数据库保持打开状态。
-
@Mattias 六个一个,六个另一个。让它一直打开通常是可以的,但是当你的应用程序在后台运行时,你可能真的想关闭它,因为系统/用户可能会终止应用程序。只要您没有任何待处理的交易,通常应该没问题,但是……总比抱歉更安全。还;如果您要直接使用 SQLite API,您必须考虑如何以最正确的方式处理这些 API 返回的每个错误代码。无法告诉您数据丢失/崩溃的次数到“没有处理那个错误代码”。
标签: objective-c xcode sqlite ios7