Sqlite - “无法理解的存档”问题

Posted

技术标签:

【中文标题】Sqlite - “无法理解的存档”问题【英文标题】:Sqlite - "incomprehensible archive" problem 【发布时间】:2009-11-09 09:36:01 【问题描述】:

我正在开发一个 iphone/Ipod touch 项目,该项目涉及从 sqlite 数据库中保存和获取数据。它工作正常,但在开发的某些时候我得到这个错误(当应用程序启动时):

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[NSKeyedUnarchiver initForReadingWithData:]:无法理解的存档(0x4e、0x49、0x42、0x41、0x72、0x63、0x68、0x69)” 2009-11-09 10:08:28.810 FagNavigasjon[1627:20b]

以前我只能通过恢复到早期的开发点并继续来解决这个问题。这次我发现如果我注释掉代码的某个部分,应用程序不会崩溃。

while(sqlite3_step(selectstmt3)==SQLITE_ROW)
/*
            NSString *navn=[[NSString alloc] initWithUTF8String: (char *)sqlite3_column_text(selectstmt3, 0)];
         NSString *telefon=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt3, 1)];
         NSString *fodselsar=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt3, 2)];
         NSString *ariframtiden=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt3, 3)];
         NSString *verneplikt=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt3, 4)];
         NSString *utdannelse=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt3, 5)];
        NSString *epost=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt3, 6)];

        appDelegate.navn=navn;
        appDelegate.epost=epost;
        appDelegate.telefon=telefon;
        appDelegate.fodselsar=fodselsar;
        appDelegate.studiear=ariframtiden;
        appDelegate.utdannelse=utdannelse;
        appDelegate.verneplikt=verneplikt;
        */
     

当然,该应用程序不再加载数据。此代码以前有效,并且在此错误之前我没有更改它。但是,我已经向数据库中添加了新记录,但是当我在 SQLite 管理器中查看它们时,这些似乎还可以。谁能告诉我什么会导致这个问题?感谢您的任何回复!

【问题讨论】:

【参考方案1】:

您是否尝试过逐行取消注释以查看导致问题的行?如果您知道是哪一行造成的,请尝试查看数据库中的数据是否正确,如果您使用版本控制,请尝试将数据库恢复到添加新记录之前的状态。

附言 你看过Core Data吗?它可以让您的生活更轻松。

【讨论】:

感谢您的回答!我已经尝试一点一点地取消注释,这是由第一行引起的: NSString *navn=[[NSString alloc] initWithUTF8String: (char *)sqlite3_column_text(selectstmt3, 0)];据我了解,该行是在数据库中找到的,但是一旦我开始从中读取,我就会收到错误...我还没有检查过核心数据,但我会的。感谢您的建议!【参考方案2】:

仅作记录:我已经解决了这个问题,但我仍然不明白如何解决。据我所知,哪个表导致了问题。我使用 SQLlite 管理器进入那里并更改了一些 varchar 字段的值,问题就消失了……不过,旧值看起来还不错。希望我能解释为什么这解决了它...

【讨论】:

以上是关于Sqlite - “无法理解的存档”问题的主要内容,如果未能解决你的问题,请参考以下文章

Android SQLit数据库学习

Sqlit--学习教程(建立数据库表)

Sqlit--学习教程(命令)

sqlit3事务

python连接sqlite3出错

WinForm杂记:C#操作SQLite数据库(总结)