应用程序强制关闭清除 SQLite 条目

App force close clearing up SQLite entries

我使用以下方法创建了 SQLite 数据库。当用户首次登录时,我向该数据库插入几条记录。在随后的登录中,我使用此信息进行进一步处理。只要用户不使用 approach described here 强制关闭应用程序,这就可以正常工作。

如果用户强制关闭并再次登录应用程序,输入的所有信息he/she都会丢失。现在我的问题是,如何确保 "force close" 不会清除我的数据?任何帮助表示赞赏。

onViewLoad,如果需要创建table:

//Database code start.
    NSArray *dirPaths;
    NSString *docsDir;
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = dirPaths[0];
    _databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingString:@"users.db"]];

    sqlite3* db = NULL;
    int rc=0;

    rc = sqlite3_open_v2([_databasePath cStringUsingEncoding:NSUTF8StringEncoding], &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
    if (SQLITE_OK != rc)
    {
        sqlite3_close(db);
        NSLog(@"Failed to open db connection");
    }
    else
    {
        char * query ="CREATE TABLE IF NOT EXISTS USERS(username TEXT, userid INTEGER NOT NULL)";
        char * errMsg;
        rc = sqlite3_exec(db, query,NULL,NULL,&errMsg);

        if(SQLITE_OK != rc)
        {
            NSLog(@"Failed to create table rc:%d, msg=%s",rc,errMsg);
        }

        sqlite3_close(db);
    }
    //END of table creation.

在 "Login button click"

//Start SQLite DB operation.
                        sqlite3* db = NULL;
                        int rc=0;
                        rc = sqlite3_open_v2([_databasePath cStringUsingEncoding:NSUTF8StringEncoding], &db, SQLITE_OPEN_READWRITE , NULL);
                        if (SQLITE_OK != rc)
                        {
                            sqlite3_close(db);
                            NSLog(@"Failed to open db connection");
                        }
                        else
                        {
                            NSString *insertSQL = [NSString stringWithFormat:
                                                   @"INSERT INTO USERS(username, userid) values (\"%@\",\"%@\")",
                                                   uName,uID];
                            char * errMsg;
                            rc = sqlite3_exec(db, [insertSQL UTF8String] ,NULL,NULL,&errMsg);
                            if(SQLITE_OK != rc)
                            {
                                NSLog(@"Failed to insert record  rc:%d, msg=%s",rc,errMsg);
                            }
                            sqlite3_close(db);
                        }

                        //End of sqlite DB operation.

只要用户不强制关闭应用,数据就不会被清除。

编辑:

花了很多时间后,我发现文件夹路径是正确的,但我在 phone 上遇到了 "unable to open database file" 问题。

经过漫长痛苦的调试周期后,我确定了这个问题:

 _databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingString:@"users.db"]];

应该是:

 _databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent:@"users.db"]];

令人惊讶的是,第一种方法在模拟器中运行良好,互联网上的大多数示例(如 this)都使用第一种方法。