iOS sqlite blob 写入失败 'unknown error'
iOS sqlite blob write fails with 'unknown error'
我有一个基于 SQLite 的应用程序,可以在 Windows、Android 和 Java 上正常运行。我正在尝试将其移植到 iOS:设备是 运行 iOS 9.3.1.
除 blob 写入外,其他一切正常,后者在使用 "unknown error" 的 sqlite_step 调用中失败。代码基于this SE post.
这是低级 SQLite 接口的精简版:查询来自下一级。
NSLog (@"Preparing query {%s}", query);
rc = sqlite3_prepare_v2 (hdb, query, -1, &stmt, &tail);
if (rc == SQLITE_OK) {
NSLog (@"Binding blob: size= %d", (int)[blob length]);
rc = sqlite3_bind_blob (stmt, 1, [blob bytes], (int) [blob length], SQLITE_STATIC);
if (rc == SQLITE_OK) {
rc = sqlite3_step (stmt);
if (rc != SQLITE_OK)
[self sql_error: @"sqlDo" line: __LINE__];
}
if (sqlite3_finalize (stmt) != SQLITE_OK)
[self sql_error: @"sqlEndQuery" line: __LINE__];
}
这是 NSLog 输出:
Preparing query {INSERT OR REPLACE INTO xxx VALUES (18356, '', ?)}
Binding blob: size= 5388
SQL error at line 157 in sqlDo: query:{INSERT OR REPLACE INTO xxx VALUES (18356, '', ?)} message:{unknown error}
执行 INSERT
语句的 sqlite3_step
后,结果是 SQLITE_DONE
,而不是 SQLITE_OK
。
那么,你想要:
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE)
[self sql_error: @"sqlDo" line: __LINE__];
我有一个基于 SQLite 的应用程序,可以在 Windows、Android 和 Java 上正常运行。我正在尝试将其移植到 iOS:设备是 运行 iOS 9.3.1.
除 blob 写入外,其他一切正常,后者在使用 "unknown error" 的 sqlite_step 调用中失败。代码基于this SE post.
这是低级 SQLite 接口的精简版:查询来自下一级。
NSLog (@"Preparing query {%s}", query);
rc = sqlite3_prepare_v2 (hdb, query, -1, &stmt, &tail);
if (rc == SQLITE_OK) {
NSLog (@"Binding blob: size= %d", (int)[blob length]);
rc = sqlite3_bind_blob (stmt, 1, [blob bytes], (int) [blob length], SQLITE_STATIC);
if (rc == SQLITE_OK) {
rc = sqlite3_step (stmt);
if (rc != SQLITE_OK)
[self sql_error: @"sqlDo" line: __LINE__];
}
if (sqlite3_finalize (stmt) != SQLITE_OK)
[self sql_error: @"sqlEndQuery" line: __LINE__];
}
这是 NSLog 输出:
Preparing query {INSERT OR REPLACE INTO xxx VALUES (18356, '', ?)}
Binding blob: size= 5388
SQL error at line 157 in sqlDo: query:{INSERT OR REPLACE INTO xxx VALUES (18356, '', ?)} message:{unknown error}
执行 INSERT
语句的 sqlite3_step
后,结果是 SQLITE_DONE
,而不是 SQLITE_OK
。
那么,你想要:
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE)
[self sql_error: @"sqlDo" line: __LINE__];