开发环境:

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. Javascript生成二维码(QR)

    网络上已经有非常多的二维码编码和解码工具和代码,很多都是服务器端的,也就是说需要一台服务器才能提供二维码的生成.本着对服务器性能的考虑,这种小事情都让服务器去做,感觉对不住服务器,尤其是对于大流量的网 ...

  2. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

  3. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  4. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  5. AFNetworking 3.0 源码解读(八)之 AFImageDownloader

    AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...

  6. 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)

    在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ...

  7. .Net语言 APP开发平台——Smobiler学习日志:手机应用的TextTabBar快速实现方式

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...

  8. Node.js入门(一)

    一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...

  9. Android之网络数据存储

    一.网络保存数据介绍 可以使用网络来保存数据,在需要的时候从网络上获取数据,进而显示在App中. 用网络保存数据的方法有很多种,对于不同的网络数据采用不同的上传与获取方法. 本文利用LeanCloud ...

  10. Spring异步功能

    使用 Spring 的异步功能时,实质是使用的 Servlet3 及以上版本的异步功能. Spring 的异步处理机制需要在 web.xml 中全部的 servlet 和 filter 处配置 < ...