ios-打开SQlite数据库的时候报错

问题描述

打开SQlite数据库的时候报错

用嵌入SQLite数据库开发ios应用,我把数据库放到SQlite管理员,然后拖到Xcode工程中。但是当我打开DB的时候,报错 out of memory ,不知道是不是SQlite的bug,因为我的文件很小,应该不会报出内存问题。

初始化数据库的代码:

- (id)initWithPath:(NSString *)path {
if (self = [super init]) {
    BOOL success;
    NSError *error;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"SoundLib_DB.sqlite"];

    if ([fileManager fileExistsAtPath:dbPath] == NO) {
        NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"SoundLib_DB" ofType:@"sqlite"];
        [fileManager copyItemAtPath:resourcePath toPath:dbPath error:&error];
    }

    success = [fileManager fileExistsAtPath:dbPath];
    if(!success)
    {
        NSLog(@"Cannot locate database file '%@'.", dbPath);
    }
    sqlite3 *dbConnection;
//Here is when I get the error, at trying to open the DB
    if (sqlite3_open_v2("SoundLib", &dbConnection, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) {
        NSLog(@"[SQLITE] Unable to open database!");
        NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));
        return nil;
    }
    database = dbConnection;
}
return self;
}

解决方案

报错可能是由于数据库路径传递为UTF8String,我看见你传递"SoundLib",不能这样直接传递。

 if (sqlite3_open([dbPath UTF8String], &databaseHandle) == SQLITE_OK)
{
   //dbPath is your full database path you getting above
}

P.S.dbpath作为const char

const char *dbpath

解决方案二:

应该是你忘了 UTF8String

sqlite3 *database;
int result = sqlite3_open([dbPath UTF8String], &database);
if (result != SQLITE_OK) {
    sqlite3_close(database);
    NSLog(@"Error opening databse");
    return;
}
时间: 2024-12-02 15:22:23

ios-打开SQlite数据库的时候报错的相关文章

iOS中SQLite数据库使用详解

使用SQLite数据库 创建数据库 创建数据库过程需要3个步骤: 1.使用sqlite3_open函数打开数据库: 2.使用sqlite3_exec函数执行Create Table语句,创建数据库表: 3.使用sqlite3_close函数释放资源. 这个过程中使用了3个SQLite3函数,它们都是纯C语言函数,通过Objective-C去调用C函数当然不是什么问题,但是也要注意Objective-C数据类型与C数据类型兼容性问题. 下面我们使用SQLite技术实现备忘录案例,与属性列表文件实现

iOS中sqlite数据库的原生用法_IOS

在iOS中,也同样支持sqlite.目前有很多第三方库,封装了sqlite操作,比如swift语言写的SQLite.swift.苹果官网也为我们封装了一个框架:CoreData. 它们都离不开Sqlite数据库的支持. 本文主要介绍下,如何在swift中使用原生的sqlite的API. 在Xcode中引入sqlite API 新建一个swift项目后,我们需要让项目引入sqlite的动态链接库: 1.项目配置界面,选择Build Phases 2.点开Link Binary With Libra

android-安卓 自定义摄像头,打开前置摄像头,startPreview报错,求大神帮助

问题描述 安卓 自定义摄像头,打开前置摄像头,startPreview报错,求大神帮助 报错信息:java.lang.RuntimeException: startPreview failed 解决方案 把setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);调用放在Activity的onCreate中 解决方案二: 把setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);调用放在Activity的onCre

rc local-在 rc.local 中添加shell脚本开机启动后,如果需要用到数据库,会报错,怎么解决

问题描述 在 rc.local 中添加shell脚本开机启动后,如果需要用到数据库,会报错,怎么解决 会出现这样的报错,感觉是数据库还没启动完. OperationalError: (2006, 'MySQL server has gone away') 但是已经加了非常长的延时,还是不行,开机后自己手动启动的话就不会出现在这个问题,怎么解决 解决方案 你需要放在数据库启动之后.不然你的脚本启动的时候,数据库还没有启动 解决方案二: 你明白出错的原因啊,放在数据库启动完了之后在执行这个脚本就OK

eclipse-请教哈大家,今天打开Eclipse,它又报错啦

问题描述 请教哈大家,今天打开Eclipse,它又报错啦 今天打开Eclipse,它又出问题啦,之前已经编辑且运行过的android project这会儿,不知道怎么出错了?之前还运行过的,都没报错啊,我把报错的文件都删了,包括appcompat_v7,然后,又重建了一个工程,结果,新工程一打开便是错误,不过,不是代码错误,附图: 解决方案 eclipse 打开报错eclipse打开报错eclipse打开报错 解决方案二: Alt+Enter看你build path jar包引入问题,上图错误显

配置-tomcat启动,spring框架连接Oracle数据库,listener报错

问题描述 tomcat启动,spring框架连接Oracle数据库,listener报错 2.并且我的oracle数据库实例是orcl,到这里变成了orcllyq 3.我尝试改过listener.ora文件,也不好使 4.这是我的listener.ora文件的配置,我都要崩溃了 解决方案 这里貌似配置全错了 你的listener配置的sid是CLRExtProc,然后你的程序的sid是ORCLLYQ 解决方案二: 没有正确 配置数据库 ,没有正常连接,你自己的数据库登陆密码要与 项目中设置的 p

mysql数据库,workbench,报错,sql格式错误?

问题描述 mysql数据库,workbench,报错,sql格式错误? 建立数据库是卡住了 代码如下,最后三行的前面出来红色的×. 请问,什么问题? begin if new.item_type_id<> old.item_type_id or new.measure_type_id <> old.measure_type_id or new.per_quantity<> old.per_quantity or new.total_weight<> old.

android-不能打开 SQLite 数据库

问题描述 不能打开 SQLite 数据库 我使用下面的代码打开 SQLite 数据库: dbHelper = new DataBaseHelper(context); public static void open() throws SQLException { try { database = dbHelper.getWritableDatabase(); } catch (Exception e) { e.printStackTrace(); Log.d(Tag.getTag("open()

把图片以流存进数据库然后从数据库读取出来报错,出错信息:参数无效

问题描述 把图片以流存进数据库然后从数据库读取出来报错,出错信息:参数无效 解决方案 为什么你的dishsimage只有13个字节?它是合法的图片二进制数据么? 解决方案二: 不太懂...可是图片读入数据库DishDesImage显示的是二进制数据 解决方案三: 数据库查出来是这样的