【问题标题】:iOS9 - SQlite3_changes looks like brokeniOS9 - SQlite3_changes 看起来像坏了
【发布时间】:2016-01-08 10:21:08
【问题描述】:

我们现有的 SQlite3 DB 实现可以在 iOS v8.4.1 上完美运行。 在 iOS9 上,DB 模块无法按预期工作。在调查该问题时,我们发现 SQlite3_changes 没有提供自上次修改后数据库中发生的更改计数。

有没有人遇到过类似的问题?谢谢你的帮助.....

我们定义了一种按需插入记录的方法。方法: 1. 如果可用,使用 sqlite3_open 打开数据库 2.准备SQL语句 - sqlite3_prepare_v2 3.执行SQL语句-sqlite3_step一个接一个,直到所有记录完成。 4. 对每条执行的sql语句执行sqlite3_reset和sqlite3_finalize。 5. 提交事务 - 使用 sqlite3_exec 6. sqlite3_close - 最后关闭数据库。

在后续调用中,我们检查始终返回 0 的数据库更改。

  • (int)DBchanges { 整数值; if((值 = sqlite3_changes(self->_db)) != SQLITE_OK){ NSLog(@"条目失败:%s", sqlite3_errmsg(self->_db)); } 返回值; }

【问题讨论】:

标签: ios iphone sqlite ios9


【解决方案1】:

请发布一个显示问题的小型可编译示例。这在 iOS 9 模拟器中运行良好:

sqlite3 *database = NULL;
int err = sqlite3_open( ":memory:", &database );
if ( err == 0 )
    err = sqlite3_exec(database, "Create table if not exists MyTable (MyColumn integer);", NULL, NULL, NULL );

// prints "1"
err = sqlite3_exec(database, "insert into MyTable values(0);", NULL, NULL, NULL );
if ( err == 0 )
    NSLog( @"changes: %d", sqlite3_changes(database) );

// prints "3"
err = sqlite3_exec(database, "insert into MyTable values (0), (1), (2);", NULL, NULL, NULL );
if ( err == 0 )
    NSLog( @"changes: %d", sqlite3_changes(database) );

【讨论】:

  • 感谢您的回复。我已经检查过这种情况。有用。我的观点是您需要在事务后关闭数据库(如 INSERTor UPDATE 或 DELETE)。关闭数据库后,在 iOS 8.4.1 上调用 sqlite3_changes(database) 将导致数据库更改,但在 iOS 9 中,这将给出 0。
  • 我不认为这是每个官方支持的 - 你只是走运了。关闭数据库后,如果不重新打开数据库,您将无法再次对其进行任何调用,并且更改将被重置。
  • 谢谢!这有助于我们确定问题的严重程度!
【解决方案2】:

documentation 说:

此函数返回唯一参数指定的数据库连接上最近完成的 INSERT、UPDATE 或 DELETE 语句修改、插入或删除的行数。

如果您关闭连接并打开另一个连接,它将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2018-11-06
    • 2016-05-24
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多