【问题标题】:Assertion failure when trying to insert into sqlite database on iphone尝试在 iphone 上插入 sqlite 数据库时断言失败
【发布时间】:2011-07-05 12:00:44
【问题描述】:

我真的对这个错误感到沮丧。我花了两天时间来解决这个问题。但它没有得到修复,当时从数据库中获取数据时没有问题。但是当触发插入语句时。我明白了错误:

-[NewJourney addJourney] 中的断言失败,/Users/HarishYadav/Desktop/JourneyMapper/Journey/NewJourney.m:114 2011-07-05 17:23:13.739 Journey[24328:207] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“插入数据时出错。 '数据库被锁定'' * 首次抛出时调用堆栈:

这是我在数据库中插入值的代码

-(void)addJourney { if (addStmt == nil) {

    const char * sql = "insert into UserJourney(JourneyName,LocationName,Description) Values (?,?,?)";
    if (sqlite3_prepare_v2(database, sql, -1,&addStmt ,NULL) != SQLITE_OK)

        NSAssert1(0,@"Error while creating add statement. '%s'",sqlite3_errmsg(database));

    }
    sqlite3_bind_text(addStmt, 1, [journeyname UTF8String], -1,SQLITE_TRANSIENT);
    sqlite3_bind_text(addStmt, 2, [journeylocation UTF8String],-1, SQLITE_TRANSIENT);
    sqlite3_bind_text(addStmt, 3, [journeydescription UTF8String],-1 , SQLITE_TRANSIENT);

    if (SQLITE_DONE != sqlite3_step(addStmt)) 

        NSAssert1(0,@"Error while inserting data. '%s'",sqlite3_errmsg(database));

    else 

        journeyID = sqlite3_last_insert_rowid(database);

    sqlite3_reset(addStmt);

}

这是什么问题

提前致谢

【问题讨论】:

  • 似乎数据库是从其他地方访问的。这就是为什么它说数据库已锁定。尝试使用 NSZombie 调试您的应用程序。我更喜欢将 FMDB 用于 sqlite 目的。
  • 是的,我的数据库可以从其他类获得访问权限
  • Jignesh 是正确的使用 finalize 语句,看看它是否有效。但我更喜欢 FMDB 的 sqlite。它很容易实现,易于调试,您不必为使用 SQLite 做很多努力。 FMDB 会处理所有事情。
  • @Rahul 我不知道如何使用 FMDB。我现在正在使用 sqlite 数据库。我认为它会变得一团糟。
  • 如果您的应用程序处于完成阶段,请坚持使用 sqlite。但是为了将来使用 FMDB。

标签: iphone objective-c sqlite


【解决方案1】:

您需要在完成您的声明后使用

sqlite3_finalize(语句);

在您使用数据库交互的每个函数中。

【讨论】:

  • sqlite3_finalize 函数将所有事务提交到数据库中,如果您在向/从数据库插入/更新/选择数据后不执行 sqlite3_finalize,sqlite 将创建日志文件并且该文件将在您执行时暂时可用sqlite3_finalize,它将提交到数据库。所以与此同时,它将被锁定。
  • 我有函数 +(void)finalizeStatements { if (database) sqlite3_close(database); if (数据库) sqlite3_finalize(deleteStmt); if (数据库) sqlite3_finalize(addStmt);如果(数据库)sqlite3_finalize(detailStmt); if (数据库) sqlite3_finalize(updateStmt); }
  • 我把这个(void)finalizeStatements调用到appdelegate的-(void)applicationWillTerminate:(UIApplication )application { / 当应用程序即将终止时调用。另请参阅 applicationDidEnterBackground:。 */ [self.journeyList makeObjectsPerformSelector:@selector(saveAllData)]; [NewJourney finalizeStatements]; }
  • 我认为,在每个语句中,您都需要调用 sqlite3_finalize 函数
【解决方案2】:

检查您的数据库是否已打开?

if(sqlite3_open([temppath UTF8String], &database) == SQLITE_OK)

【讨论】:

  • @Rakesh Bhatt 如何检查数据库是否打开?
  • 好的,您还有其他示例项目可以帮助我添加、删除、更新数据并在行项目上显示帮助我。我试试这个示例代码项目iphonesdkarticles.com/2008/10/…。您是否有任何其他链接可以帮助我摆脱这种情况。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多