qt資料庫關閉
頭文件里的db指針定義加上extern才會在多個CPP文件中共享。
還有,Qt有很好的資源自動釋放機制,如果你只開一個連接的話沒必要close
❷ qt怎麼連接已經存在的sqlite3資料庫
採用將項目中的sqlite文件拷到android內存卡上的固定位置,先判斷位置上是否存在sqlite文件,不存在則復制文件。 sqlite可放在res的raw目錄下,亦可放在assets下,放在assets下,可新建其他層次目錄,本例選擇assets
1.首先,添加sdcard許可權在AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在activity中有如下代碼
2.Java代碼
button2.setOnClickListener(new Button.OnClickListener() {
@Override
publicvoid onClick(View arg0) {
try{
String DATABASE_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/testdb"; //將要存放於的文件夾
String DATABASE_FILENAME = "testDatabase.db"; //文件名
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
// 如果/sdcard/testdb目錄中存在,創建這個目錄
if (!dir.exists())
dir.mkdir();
// 如果在/sdcard/testdb目錄中不存在
// test.db文件,則從asset\db目錄中復制這個文件到
// SD卡的目錄(/sdcard/testdb)
if (!(new File(databaseFilename)).exists()) {
// 獲得封裝testDatabase.db文件的InputStream對象
AssetManager asset=getAssets();
InputStream is=asset.open("db/testDatabase.db");
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = newbyte[8192];
int count = 0;
// 開始復制testDatabase.db文件
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
asset.close();
}
SQLiteDatabase mSQLiteDatabase=openOrCreateDatabase(databaseFilename, Activity.MODE_PRIVATE, null);//有則打開,沒有創建
Cursor cur=mSQLiteDatabase.rawQuery("select * from table1", null);
if(cur!=null){
if(cur.moveToFirst()){
do{
int idColumnIndex=cur.getColumnIndex("id");
int numColumnIndex=cur.getColumnIndex("num");
int dataColumnIndex=cur.getColumnIndex("data");
int id=cur.getInt(idColumnIndex);
int num=cur.getInt(numColumnIndex);
String data=cur.getString(dataColumnIndex);
System.out.println("id:"+id+";num:"+num+";data:"+data);
}while(cur.moveToNext());
cur.close();
}
}
mSQLiteDatabase.close();//關閉資料庫連接
}catch(Exception e){
e.printStackTrace();
}
//deleteDatabase("testDatabase.db");//刪除資料庫
}
});
❸ 如何用Qt連接資料庫並導入文件
QT 自帶的資料庫是很好用的。
以下給一些我寫的例子:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //添加資料庫
db.setDatabaseName("note.db"); //創建一個note.db的文件存儲數據
db.open(); //開啟資料庫
query = QSqlQuery(db); //獲得訪問資料庫的query
query.exec(XXX); //執行指令(XXX為SQL指令)
db.close(); //關閉資料庫
大致只要知道以上例子就OK了。一般而言會將db變數作為全局變數或者數據成員,當需要訪問的時候就獲取一個query就可以了。
另外,要實現所提到的功能,要好好看看QString、QStringList,這兩玩意主要是臨時存放數據、分割數據等作用,另外,要看QFile、QDir、QFileInfo、QTextStream,這四個主要用來讀取文本數據。看看QVector或者QList等來存放讀出來的數據。
另外,要實現這玩意,SQL的語句不要求精通,但是基本的Create、Insert、Select、Delete等操作要准確無誤。否則出錯了QT是看不出來的。QT不會檢測SQL的准確性的。
再另外,在QT的編程中,C++和類都很重要,所以還是得看看。
還有不明白的話歡迎留言
❹ sqlite 出現 data locked 是什麼原因
unable to close e to unfinalised statements,Qt的SQL模塊的問題
unable to close e to unfinalised statements,Qt的SQL模塊的問題
造成「unable to close e to unfinalised statements」錯誤的原因有狠多,本座這里說的是QT的問題。
SQLITE要求,在關閉資料庫之前,所有活躍的查詢都要終結掉。如果在終結掉那些查詢之前就關閉資料庫,則關閉操作會失敗,並且得到「unable to close e to unfinalised statements」這樣的錯誤。
QT的SQLITE驅動有漏洞,API並沒有提供對應的函數來讓程序猿顯式地終結那些活躍狀態的查詢對象,而用來關閉資料庫連接的
QSqlDatebase::close函數又不做這些終結操作。這樣就導致某些(其實狠頻繁地出現)情況下無法關閉SQLITE資料庫,文件描述符被繼
續佔用著。而再又打開SQLITE資料庫的話,又增加咯程序打開的文件描述符的數量,並且也不能關閉。如此下去,直到文件描述符達到系統限制,終於無法再
連接到SQLITE資料庫咯。本座今天碰到的就是這樣的問題,從/proc偽文件系統中看到自己的程序打開咯1024個文件,其中絕大部分都是某個
SQLITE資料庫文件。
參考這里:https://codereview.qt-project.org/#change,20121
據說QT開發者在QT4.8.2中已經解決咯這個問題,有條件的哥哥們可以升級到QT4.8.2試試,本座目前用的是QT4.8.1,要等到QtSDK中的QT版本升級到4.8.2才能升級。像本座這樣沒條件升級的哥哥就要用另外的辦法來繞過咯。
要繞過也簡單,對於同一個SQLITE資料庫,在程序中打開一個SQLITE資料庫連接之後,一直用這個連接,不再關閉,到最後程序退出的時候再關閉SQLITE連接。那個時候,在關閉之前銷毀所有存在的查詢對象,就可以正常關閉SQLITE資料庫咯。
總之,在升級到QT4.8.2之前,不要頻繁關閉SQLITE資料庫,那是無用功。
SQLite做為客戶端應該很給力,但如果做為服務端應用,在並發處理上會傷感情的。