gpt4 book ai didi

ios - 数据未插入 sqliteDB iOS 中

转载 作者:行者123 更新时间:2023-12-02 20:31:29 25 4
gpt4 key购买 nike

我已经在现有数据库中创建了一个表(REPORTDATA)。我正在尝试将值插入到表中。但它没有插入。我正在使用以下代码。

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];
databasePath = [docsDir stringByAppendingPathComponent:@"Album.db"];
const char *dbpath = [databasePath UTF8String];
NSString *insertSQL;
if (sqlite3_open(dbpath, & albumDB) == SQLITE_OK)
{
int rowCount = [self GetArticlesCount];
rowCount += 1;
NSString *tempcount = [NSString stringWithFormat:@"%d", rowCount];
insertSQL = [NSString stringWithFormat: @"INSERT INTO REPORTDATA (Num, Json) VALUES ('%@','%@')", tempcount, tempcount];
char *errmsg=nil;
if(sqlite3_exec(albumDB, [insertSQL UTF8String], NULL, NULL, &errmsg)==SQLITE_OK)
{
}
else
{
NSLog(@"Error Message is =%s",errmsg);
}
}
sqlite3_close(albumDB);

获取表中的行数:

- (int) GetArticlesCount
{
int count = 0;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];
databasePath = [docsDir stringByAppendingPathComponent:@"Album.db"];
if (sqlite3_open([self.databasePath UTF8String], &albumDB) == SQLITE_OK)
{
const char* sqlStatement = "SELECT COUNT(*) FROM REPORTDATA";
sqlite3_stmt *statement;
if( sqlite3_prepare_v2(albumDB, sqlStatement, -1, &statement, NULL) == SQLITE_OK )
{
//Loop through all the returned rows (should be just one)
while( sqlite3_step(statement) == SQLITE_ROW )
{
count = sqlite3_column_int(statement, 0);
}
}
else
{
NSLog( @"Failed from sqlite3_prepare_v2. Error is: %s", sqlite3_errmsg(albumDB) );
}
sqlite3_finalize(statement);
sqlite3_close(albumDB);
}
return count;
}

我正在获取

Error Message is =(null).

最佳答案

我建议检查sqlite3_exec的实际返回值:

int rc;
char *errmsg = NULL;

if ((rc = sqlite3_exec(albumDB, [insertSQL UTF8String], NULL, NULL, &errmsg)) == SQLITE_OK) {
NSLog(@"Insert succeeded");
} else {
NSLog(@"Insert failed: %s (%ld)", errmsg, (long)rc);
if (errmsg) sqlite3_free(errmsg);
}

您报告它返回了 21,即 SQLITE_MISUSE。如果您以错误的顺序调用 API 函数(例如,在数据库关闭后执行某些 SQL),则这种情况很常见。

GetArticlesCount 方法正在重新打开数据库(已打开),用新的 sqlite3 * 指针替换 albumDB 变量。然后,GetArticlesCount 正在关闭数据库,当您返回到第一个方法时,albumDB 指针现在引用已关闭的数据库句柄。因此后续的 SQL 调用将生成 SQLITE_MISUSE

为了避免这个问题,我建议不要让每个执行 SQL 的函数都通过打开和关闭数据库来实现。打开数据库一次,然后让所有后续 SQLite 调用都使用该一个 sqlite3 * 指针。

关于ios - 数据未插入 sqliteDB iOS 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32219519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com