【问题标题】:Objective C: SQLite where-statement wont work when running another method first目标 C:SQLite where 语句在首先运行另一个方法时不起作用
【发布时间】: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


【解决方案1】:

出现问题是因为我在 getSelectedProjectId 方法中关闭了数据库连接。我现在让我的数据库打开,就像一个魅力。

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多