让我先从我用来删除表格记录的代码开始:
dData("Player_Data", bErrors);
调用函数,传递表名和bool来判断是否有错误。功能:
void Database::dData(string table, bool* bErrors)
{
sqlStr2 = "Delete From " + table;
sqlite3_exec(dBase,"BEGIN TRANSACTION",NULL,NULL,&error);
if (sqlite3_prepare_v2(dBase, sqlStr2.c_str(), sqlStr2.size(), &statement2, 0) == SQLITE_OK)
{
sqlite3_step(statement2);
*bErrors = false;
finalize(statement2, bErrors);
}
else
{
*bErrors = true;
createBInfo();
d.createBReport("SQL Code 3",sqlite3_errmsg(dBase),bLocale + to_string(__LINE__),bTDate,"./SC_Log.txt");
}
sqlite3_exec(dBase,"END TRANSACTION",NULL,NULL,&error);
}
我最初将删除查询作为“删除自”+表。这是没有删除记录所以我根据SO上类似问题的建议答案将其更改为Delete * From。
无论我尝试什么,我都无法删除我的Player_Data表中的单个记录。 从Player_Data的删除查询中没有生成错误顶部标记中的代码导致记录语法错误;返回正确的语法并没有改变这种情况。
SQLite是否阻止您从c / c ++接口删除表中的最后一条记录?
答案 0 :(得分:1)
您在代码中创建了许多复杂性。您可以通过使用以下示例代码来简化此操作,使用以下模板修改您的内容,我认为它将起作用....
void Database::dData(string table, bool* bErrors)
{
NSString *tableName = [NSString stringWithUTF8String:table];
NSString *qsql = [NSString stringWithFormat:@"DELETE FROM %@", tableName];
sqlite3_stmt *statement;
if (sqlite3_prepare_v2( database_object, [qsql UTF8String], -1, &statement, NULL) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_DONE)
{
NSLog(@"%@", @"deleted");
}
}
else
{
sqlite3_close(db);
NSAssert(0, @"Failed to Delete");
}
sqlite3_finalize(statement);
}
只需修改内容,我认为它对您有用......
答案 1 :(得分:0)
好吧,我已经解决了这个问题;这是一个问题。因此,要快速总结一下这个问题,因为我正在尝试从表中删除数据以更新该数据。然而,执行该操作的功能并未产生期望的结果;没有数据被删除,并且该函数中的sql代码没有产生明显的错误。
加入SQLite3新闻组并在那里发布问题后,我们将其追踪。发生的事情是我的开始/提交本身都是错误的,我没有发现这些错误。
来自新闻组的Kees Nuyt建议捕获并打印我们的错误以查看是否有任何错误。当我这样做时,我发现通过声明抛出数据库锁定错误。在我开始一个新游戏后,当我意识到这个代码是有效的,但当我加载一个旧游戏时,我有一个脑电波,但是当我加载一个旧游戏时,我有一个脑电波。
我在我的dataSystem类(我的数据从中加载)中的lData中进行了一些繁重的调试检查(逐行),并且发现从那里得到的那些未完成的语句存在问题而不允许数据库将被关闭。
这是我们开始解决问题的地方。造成这种情况的原因有三个:
我在lData中的代码导致了问题,因为我的openDB函数调用是在他们被调用的地方,即使数据库不需要关闭(他们需要因为我需要打开我的scDatabase) .sqlite文件以获取加载过程的某些类型的数据。)
我在数据库中的getxResults函数中的finalize语句处于一个位置,如果出现问题,它们将不会被调用。
与上面相同,除了我的getRows函数之外,还有多个返回向量。
要解决这个问题,我必须解决所有这些问题。一旦所有东西都移动到需要去的地方,不再有“删除”的问题以及一直困扰我的游戏的其他错误也被修复了。