2016-04-24 10 views
0

Ich möchte sqlite Datenbank verbinden und eine Android-App schreiben.
aber, wenn ich die App ausführen, gebe ich einen Fehler, der sagte: Datenbank nicht geöffnet.wie zu SQLite von QT verbinden und es auf Android

#include "csqlconnect.h" 
#include <QFile> 
#include <QSqlQuery> 
#include <QMessageBox> 
#include <QDebug> 
#include <QSql> 
#include <QSqlError> 
#include <QSqlTableModel> 
#include <QSqlRecord> 

CSqlConnect::CSqlConnect() 
{ 
db = QSqlDatabase::addDatabase("QSQLITE","MyConnection"); 
QFile dfile("./myfile.sqlite"); 
bool dbf=dfile.exists(); 
if (!dbf) 
{ 
QFile::copy("assets:/myfile.sqlite", "./myfile.sqlite"); 
QFile::setPermissions("./myfile.sqlite",QFile::WriteOwner | QFile::ReadOwner); 
} 
db.setDatabaseName("myfile.sqlite"); 
bool open=db.open(); 
if(!open) 
{ 
QMessageBox::warning(0, "Failed to connect!", "Error connecting to  database: "+db.lastError().driverText()); 
    // qDebug()<<"Failed!!!!"; 
} 

if(open) 
{ 
QSqlQuery query; 
query.exec("create table person " 
     "(id integer primary key, " 
     "firstname varchar(20), " 
     "lastname varchar(30), " 
     "age integer)"); 

}

QSqlQuery query2; 

query2.prepare ("INTO Person INSERT (id, Vorname, Nachname, Alter) VALUES (: ID,: VORNAME,: ZUNAME,: AGE)"); query2.bindValue (": ID", 1); query2.bindValue (": VORNAME", "ali"); query2.bindValue (": LASTNAME", "alavi"); query2.bindValue (": AGE", 24); query2.exec(); QSqlTableModel-Modell; model.setTable ("Person"); modell.select(); QSqlRecord record = model.record (0); Ergebnis = Datensatz.Wert ("Vorname"). ToString(); }

QString CSqlConnect::getValue() 
{ 
    return result; 
} 

CSqlConnect::~CSqlConnect() 
{ 
db.close(); 
} 

Antwort

1

Sie versuchen, die SQLite-Datei im aktuellen Arbeitsverzeichnis (./myfile.sqlite), die nicht aus dem App beschreibbaren höchstwahrscheinlich ist zu erstellen, auf Android.

Besser einen beschreibbaren Pfad von QStandardPaths explizit erhalten:

const auto path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); 

errno = 0; 
if (!QDir(path).mkpath()) { 
    // return error, get details from strerror(errno) 
    … 
    return; 
} 

db.setDatabaseName(path + QStringLiteral("/myfile.sqlite")); 
if (!db.open()) { 
    // handle error 
    … 
    return; 
} 

… 
+0

Es ist überraschend ist, wie schwer diese Antwort in Google zu finden ist. 2 Stunden vor der Ankunft verschwendet. Für andere, die hier voller Wut und Frustration sind: benutze einfach '#ifdef Q_OS_ANDROID' und du bist da. –