【问题标题】:iOS error: Terminating app due to uncaught exception 'NSInternalInconsistencyException'iOS 错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序
【发布时间】:2012-08-24 04:03:51
【问题描述】:

我是一名新开发人员,我收到此错误。 我厌倦了通过两次添加 libsqlite3.0.dylib 并重新启动 x-code 来修复它。 即使我添加了 libsqlite3.dylib 的另一个库,但没有工作。 错误 : 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法创建带有消息的可写数据库文件

-(void)copyDatabaseIfNeeded
{
    NSFileManager * filemanger = [NSFileManager defaultManager];
    NSError *error;
    NSString *dbpath= [self getDbPath];
    BOOL success = [filemanger fileExistsAtPath:dbpath];

    if(!success)
    {
        NSString *defaultDBpath= [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"myDatabase.sqlite"];
        success = [filemanger copyItemAtPath:defaultDBpath toPath:dbpath error:&error];
        if(!success)
        {
            NSAssert1(0, @"Failed to create writeable database file with message '@' .", [error localizedDescription]);
        }
    }

}
-(NSString *)getDbPath
{
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [path objectAtIndex:0];
    return[documentsDir stringByAppendingPathComponent:@"myDatabase.sqlite"];
}

【问题讨论】:

  • 我认为您不能在应用程序包中创建数据库 - 它是只读的。
  • 如果您想在应用程序包中打开它,您必须手动指定您需要读取数据库

标签: ios ipad sqlite exception


【解决方案1】:

你去吧,这个函数打开一个数据库,如果它不存在于文档中,它会从bundle中复制它。您需要从头开始创建一个吗?

-(BOOL) openDB: (NSString *) dbName{
    NSString *dbPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    dbPath = [dbPath stringByAppendingPathComponent:dbName];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath:dbPath]) {

        NSString *sourcePath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:dbName];   
        [fileManager copyItemAtPath:sourcePath toPath:dbPath error:nil];
    }

    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))           
    {               
       NSLog(@"An error has occured opening Sqlite");  
       return FALSE;
    }

    return TRUE;
}

【讨论】:

  • 如果能帮助我从头开始创建这段代码对我很有帮助。 // 我已经对应用程序委托文件进行了这些更改,并且我从以下位置获取了代码参考:youtube.com/watch?v=4Ze2Vhi48kQ&feature=channel&list=UL
  • sqlite3_open 命令如果不存在会创建一个空数据库,在这种情况下它将是一个空数据库。因此,此方法尝试从捆绑包中复制数据库,但如果找不到,则会创建具有该名称的空白数据库。这是 sqlite3_open 的有意功能。如果您提供有关您遇到的错误或问题的更多信息,也许可以提供更多帮助。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2020-01-26
  • 1970-01-01
  • 2014-01-05
相关资源
最近更新 更多