应用程序强制关闭清除 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)都使用第一种方法。
我使用以下方法创建了 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)都使用第一种方法。