Objective c 目标C:SQLite,当首先运行另一个方法时,语句将不起作用

Objective c 目标C:SQLite,当首先运行另一个方法时,语句将不起作用,objective-c,xcode,sqlite,ios7,Objective C,Xcode,Sqlite,Ios7,因此,基本上我有一个应用程序,将提供基于选定项目的任务。项目和任务都存储在SQLite数据库中 要获取当前项目id,我将所选项目(_selectedProject)与数据库进行比较,以获取id。这是在getSelectedProjectId方法中完成的。但是,在gettask方法中运行此方法时,Where语句根本不起作用。如果我不先运行getSelectedProjectId方法,它就可以正常工作。我是不是忘了发布一些东西了?还是别的什么?有什么想法吗 我对SQLite和Objective C都

因此,基本上我有一个应用程序,将提供基于选定项目的任务。项目和任务都存储在SQLite数据库中

要获取当前项目id,我将所选项目(_selectedProject)与数据库进行比较,以获取id。这是在getSelectedProjectId方法中完成的。但是,在gettask方法中运行此方法时,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方法中关闭了DB连接。我现在让我的数据库保持打开状态,工作起来很有魅力。

当您调用GetSelectedProjectd时,请关闭数据库。(为什么不打开数据库,让它保持打开状态呢?)真是个好电话。这就是问题所在。谢谢另外,我在某个地方读到,每次使用完数据库连接后,它都应该关闭。我假设是出于安全目的?顺便说一句:不要在方法前面加
get
。另外,编写SQLite通常是浪费时间。使用FMDB,或者如果你只使用iOS/OS X,最好使用核心数据,这样你就可以利用所有可用的优化和功能。我在商业iPhone应用程序中使用SQLite已有4年了。“我们总是让DB开着。”马蒂亚斯,一个六个,另一个半打。让它一直处于打开状态通常是可以的,但当你的应用程序处于后台时,你可能真的想关闭它,因为系统/用户可能会关闭应用程序。只要您没有任何挂起的事务,通常应该是可以的,但是。。。安全总比后悔好。也;如果要直接使用SQLite API,则必须考虑如何以最正确的方式处理这些API返回的每个错误代码。无法告诉您数据丢失/崩溃的数量归结为“未处理该错误代码”。