2017-10-13 11 views
0

ですので、私はQTを使ってsqliteデータベースを作成しようとしています。 だから...私はこのコードを使用します。QSqlDatabase sqliteデータベースはiOS上で動作しません - QT 5.9クロスプラットフォーム

QString dbName = "apo.sqlite"; 
db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName(dbName); 

if(QFile::exists(dbName)) 
{ 
    db.setDatabaseName(dbName); 
    db.database(dbName,true); 
    qDebug()<<"DATABASE EXIST"; 

    if(db.open()) 
    { 
     QSqlQuery query(db); 
     query.prepare("INSERT INTO settings (username, password, remember_login) VALUES ('aaa', 'bbb', '1')"); 
     query.exec(); 

     qDebug() << "DATABASE OPEN"; 
     query.prepare("SELECT * FROM `settings`"); 
     query.exec(); 

     while (query.next()) 
     { 
      qDebug() << "USERNAME" << query.value("username").toString(); 
     } 
    } 
    else 
    { 
     qDebug() << "DATABASE CLOSED"; 
    } 
} 
else { 
    qDebug() << "DATABASE NOT EXIST, I CREATE ONE"; 

    if(!db.isOpen()) { 
     qDebug() << "ERROR I CAN'T OPEN DATABASE"; 
    } 
    else 
    { 
     QSqlQuery q; 
     q.prepare("CREATE TABLE `settings` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `username` TEXT, `password` TEXT, `remember_login` TEXT);"); 
     q.exec(); 

     qDebug() << "DB opened"; 

     QSqlQuery query(db); 
     query.prepare("INSERT INTO settings (username, password, remember_login) VALUES ('aaa', 'bbb', '1')"); 
     query.exec(); 

     query.prepare("SELECT * FROM settings"); 
     query.exec(); 

     while (query.next()) 
     { 
      qDebug() << "USERNAME" << query.value("username").toString(); 
     } 
    } 
} 

さて、あなたは私がDBを作成する最初のオープンで、アプリ上で最初のオープンチェックするために私のコードを設定していることがわかります。 2回目以降は、データベースを読んでいます。 このコードはAndroid搭載端末では動作しますが、iOS端末ではこのコードは動作しません。なぜですか? 多分、クロスプラットフォームはこのコードをサポートしていませんか?

私はqtを使用します。5.9 どこが間違っているのか分かりません。 助けてくれてありがとう。

答えて

0

iOSの作品への解決策は以下のとおりです。

QString dbName = "myDB"; 

QString dbLocation = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); 

db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName(dbLocation + "/" +dbName); 
db.database(dbLocation + "/" +dbName); 
db.databaseName(); 

iOSの作品には、データベース名の前にパスを追加し、パスを使用する必要があります。いくつかのパスをテストしましたが、DocumentsLocationを使用する場合にのみ動作します。 アップルデベロッパーからこのlinkを見ることができます。 クロスプラットフォーム、Android、iOSでも動作します。

関連する問題