Qt5 開發 iOS 應用之訪問 SQLite 數據庫

開發環境:html

macOS 10.12.1
Xcode 8.1
Qt 5.8
iPhone 6S+iOS 10.1.1
 
源代碼:
我在 Qt 程序裏指定了數據庫的名稱來建立數據庫,在 Win十、Android、macOS 下正常運行,可是在蘋果手機上報錯。
QSqlDatabase db;
db.setDatabaseName("farmer.db"); // 建立數據庫
 
問題:
在模擬器上能夠正常訪問 SQLite 數據庫,可是在真機上不行,提示以下錯誤:
QSqlDatabasePrivate::database: unable to open database: "out of memory Error opening database"
 
解決方法:
一、由於我對蘋果的開發環境一無所知,只能使用百度大法,初步確認是訪問權限的問題,我從這裏瞭解了 iOS 的沙盒目錄結構: http://blog.csdn.net/iunion/article/details/46889073
因而我修改了下代碼,直接在 Documents 目錄生成數據庫文件,仍是出錯。
db.setDatabaseName("../Documents/farmer.db");
 // 建立數據庫
二、繼續百度出來的建議是把已經生成好的數據庫文件直接部署到應用程序中,而後用代碼拷貝到 Documents 目錄下。
因而 Qt 編譯完以後,我用 Xcode 打開項目,把數據庫文件 farmer.db 加到 Resources 中,
這樣部署到真機上以後,確實有 farmer.db 文件了, 我使用 QDir::currentPath() 獲取應用的路徑,而後
 
QStringdestFile=QDir::currentPath()+"/Documents/farmer.db";
QFile::copy("farmer.db", destFile);
複製文件時報錯,又換了  QCoreApplication::applicationDirPath()  獲取應用的路徑,也不行。這兩個函數獲取的路徑是同樣的。這個路徑不是我須要的路徑。
三、終於找到了合適的方法,應該使用 QDir::homePath() , 參考了: http://www.qtcn.org/bbs/read-htm-tid-60506-fpage-2.html
這樣程序就順利的運行起來了。
四、是否是也能夠在    Documents 目錄下直接生成數據庫文件呢?試驗了一下,是能夠的,這樣就不用再打包數據庫和拷貝文件了。
五、另外,再善後一下,爲了讓程序跨平臺,對不一樣的操做系統分別處理,iOS 系統中,數據庫文件放到 Documents 目錄,其餘系統直接放到程序目錄下。
     QString destFile = "farmer.db";
#ifdef Q_OS_IOS
    qDebug("操做系統:iOS");
    destFile = QDir::homePath() + "/Documents/farmer.db";
#else
    qDebug("操做系統:非 iOS");
#endif 
 
解決這個問題,花費了我1天半的時間。記錄一下,堅持天天進步一點點。



相關文章
相關標籤/搜索