在项目的开发过程中,必然会做数据的持久化,而在iOS的开发中,存储大量数据很多人使用的是SQLite,我也是其中的一个,在项目中使用的数据库相关的第三方框架是FMDB。
前几天做项目的时候,为了偷懒,不想使用代码在项目中动态创建数据库文件和数据表,就使用可视化工具创建了一个数据库文件,直接拖进项目中,然后获取路径,使用FMDB进行操作,由于开发前期是没有使用真机进行开发的(我想,很少有人会在电脑上插个iPhone一直用来调试的吧),所以,一切进展在模拟器上都显得那么和谐、那么顺利。
临近结束的时候,使用真机测试一下,瞬间问题出现了,在向数据库中写入数据的时候,控制台一直提示: Unknown error calling sqlite3_step (8: attempt to write a readonly)
这个提示语一看就知道,这个数据库文件是一个只读的,不能执行写入操作,好吧,我改。打开项目所在的目录,找到数据库文件,设置文件的访问权限,重新运行,报错。
难道是缓存,好的,卸载手机上的APP,重新运行安装,再次报错。
打开模拟器,卸载模拟器上的APP,重新安装,运行,很正常。
怎么回事?手机上不能运行,模拟器上可以,难道不是数据库文件没有读写权限,而是数据库文件所处的位置没有读写权限?好吧,我用代码动态创建试试,结果表明,成功了,顺利运行。
经过这次事情,我突然明悟了,拖进项目中的资源是会被放在一个资源文件夹中,这个资源文件夹是只读的,也就导致了放在里面的所有文件都无法进行写入操作。所以啊,想要对资源进行读写操作,还是将需要进行读写操作的文件放到系统分配的沙盒目录下,如果实在是想使用拖进去的资源文件进行读写操作,可以先将资源文件拖进项目中,在APP运行时将资源文件复制到沙盒中进行操作。
开发中遇到的每一个错误都是一中收获,收获的可能不止这个错误的解决方案,还有其他的相关知识,每次解决错误都是一次进步,如果解决错误还没法让自己进步,放弃吧,这不是适合你的行业。