开发环境:

macOS 10.12.1
Xcode 8.1
Qt 5.8
iPhone 6S+iOS 10.1.1
 
源代码:
我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10、Android、macOS 下正常运行,但是在苹果手机上报错。
QSqlDatabase db;
db.setDatabaseName("farmer.db"); // 创建数据库
 
问题:
在模拟器上可以正常访问 SQLite 数据库,但是在真机上不行,提示如下错误:
QSqlDatabasePrivate::database: unable to open database: "out of memory Error opening database"
 
解决方法:
1、因为我对苹果的开发环境一无所知,只能使用百度大法,初步确认是访问权限的问题,我从这里了解了 iOS 的沙盒目录结构:http://blog.csdn.net/iunion/article/details/46889073
于是我修改了下代码,直接在 Documents 目录生成数据库文件,还是出错。
db.setDatabaseName("../Documents/farmer.db");

 // 创建数据库
2、继续百度出来的建议是把已经生成好的数据库文件直接部署到应用程序中,然后用代码拷贝到 Documents 目录下。
于是 Qt 编译完之后,我用 Xcode 打开项目,把数据库文件 farmer.db 加到 Resources 中,
这样部署到真机上之后,确实有 farmer.db 文件了,我使用 QDir::currentPath() 获取应用的路径,然后
 
QStringdestFile=QDir::currentPath()+"/Documents/farmer.db";
QFile::copy("farmer.db", destFile);
复制文件时报错,又换了 QCoreApplication::applicationDirPath() 获取应用的路径,也不行。这两个函数获取的路径是一样的。这个路径不是我需要的路径。
3、终于找到了合适的方法,应该使用 QDir::homePath() ,参考了:http://www.qtcn.org/bbs/read-htm-tid-60506-fpage-2.html
这样程序就顺利的运行起来了。
4、是不是也可以在  Documents 目录下直接生成数据库文件呢?试验了一下,是可以的,这样就不用再打包数据库和拷贝文件了。
5、另外,再善后一下,为了让程序跨平台,对不同的操作系统分别处理,iOS 系统中,数据库文件放到 Documents 目录,其他系统直接放到程序目录下。
     QString destFile = "farmer.db";
#ifdef Q_OS_IOS
    qDebug("操作系统:iOS");
    destFile = QDir::homePath() + "/Documents/farmer.db";
#else
    qDebug("操作系统:非 iOS");
#endif 
 
解决这个问题,花费了我1天半的时间。记录一下,坚持每天进步一点点。

Qt5 开发 iOS 应用之访问 SQLite 数据库的更多相关文章

  1. IOS开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

  2. 【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们 ...

  3. 【Android】13.4 使用SQLite.NET.Async-PCL访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 这一节演示如何利用以异步方式(async.await)访问SQLite数据库. 二.示例4运行截图 下面左图为初始 ...

  4. 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 SQliteDemo1的例子演示了SimpleCursorAdapter的用法,本节我们将使用用途更广的自定义的游 ...

  5. 【Android】13.1 用Android自带的API访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 这一节我们先来看看如何直接用Android自带的API创建和访问SQLite数据库. 1.创建SQLite数据库 ...

  6. 并发访问sqlite数据库出现databse is locked的错误的一个解决办法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在并发访问sqlite数据库会出现这样一个错误:databseis locked,这是sqlite数据库对并发支持不太 ...

  7. 【C#】使用EF访问Sqlite数据库

    原文:[C#]使用EF访问Sqlite数据库 1. 先上Nuget下载对应的包 如图,搜索System.Data.SQLite下载安装即可,下载完之后带上依赖一共有这么几个: EntityFramew ...

  8. 以EntifyFramework DBFirst方式访问SQLite数据库

    前面一直在找EF Code First方式来访问SQLite数据库,后面得出的结论是SQLite不支持 Code First, 虽然有非官方的库SQLite.CodeFirst可以使用,但一直没搞成功 ...

  9. 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...

随机推荐

  1. 在SQL2008查找某数据库中的列是否存在某个值

    在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...

  2. 快速构建H5单页面切换骨架

    在Web App和Hybrid App横行的时代,为了拥有更好的用户体验,单页面应用顺势而生,单页面应用简称`SPA`,即Single Page Application,就是只有一个HTML页面的应用 ...

  3. FREERTOS 手册阅读笔记

    郑重声明,版权所有! 转载需说明. FREERTOS堆栈大小的单位是word,不是byte. 根据处理器架构优化系统的任务优先级不能超过32,If the architecture optimized ...

  4. Js new到底发生了什么

    在Js中,我们使用了new关键字来进行实例化 那么在这个new的过程中到底发生了什么? 关于构造函数的return 正常来讲构造函数中是不用写return语句的,因为它会默认返回新创建的对象. 但是, ...

  5. 06.SQLServer性能优化之---数据库级日记监控

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 之前说了一下数据库怎么发邮件:http://www.cnblogs.com/duniti ...

  6. 解决PHP-问题:Class 'SimpleXMLElement' not found in

    1.问题 在ubuntu 16.10中,学习PHP,学习到PHP如何生成XML文件时候,碰到了这个问题: PHP Fatal error: Class 'ClassName\SimpleXMLElem ...

  7. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  8. DDD 领域驱动设计-商品建模之路

    最近在做电商业务中,有关商品业务改版的一些东西,后端的架构设计采用现在很流行的微服务,有关微服务的简单概念: 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独 ...

  9. StrategyPattern (策略模式)

    /** * 策略模式 * @author TMAC-J * 根据环境的不同选择不同的策略,把策略用接口抽象出来 */ public class StrategyPattern { interface ...

  10. 为什么 Android Studio 工程文件夹占用空间这么大?我们来给它减减肥

    偶然中发现Android Studio的工程文件夹比ADT Bundle的大很多.用Android Studio新建一个空工程,工程文件夹大小为30M,运行一次后大小为40M.同样用ADT Bundl ...