開發環境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1 源代碼: 我在 Qt 程式里指定了資料庫的名稱來創建資料庫,在 Win10、Android、macOS 下正常運行,但是在蘋果手機上報錯。 QSqlDatabase db; db.se ...
開發環境:
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天半的時間。記錄一下,堅持每天進步一點點。