[英]Using SQLite in Codename One Application
我有一個工作的sqlite數據庫,我將它放在/ src文件夾中。 然后,我進入了Codename One網站,並遵循了他們的doc示例
Database db = null;
Cursor cur = null;
try {
db = Display.getInstance().openOrCreate("MyDb.db");
if(query.getText().startsWith("select")) {
cur = db.executeQuery(query.getText());
int columns = cur.getColumnCount();
frmMain.removeAll();
if(columns > 0) {
boolean next = cur.next();
if(next) {
ArrayList<String[]> data = new ArrayList<>();
String[] columnNames = new String[columns];
for(int iter = 0 ; iter < columns ; iter++) {
columnNames[iter] = cur.getColumnName(iter);
}
while(next) {
Row currentRow = cur.getRow();
String[] currentRowArray = new String[columns];
for(int iter = 0 ; iter < columns ; iter++) {
currentRowArray[iter] = currentRow.getString(iter);
}
data.add(currentRowArray);
next = cur.next();
}
Object[][] arr = new Object[data.size()][];
data.toArray(arr);
frmMain.add(BorderLayout.CENTER, new Table(new DefaultTableModel(columnNames, arr)));
} else {
frmMain.add(BorderLayout.CENTER, "Query returned no results");
}
} else {
frmMain.add(BorderLayout.CENTER, "Query returned no results");
}
} else {
db.execute(query.getText());
frmMain.add(BorderLayout.CENTER, "Query completed successfully");
}
frmMain.revalidate();
} catch(IOException err) {
frmMain.removeAll();
frmMain.add(BorderLayout.CENTER, "Error: " + err);
frmMain.revalidate();
} finally {
Util.cleanup(db);
Util.cleanup(cur);
}
但是,當我運行示例並嘗試執行簡單的選擇查詢時,出現此錯誤...
java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such table: MyTable)
我錯過了一步嗎?
謝謝
您確定執行時當前的工作目錄是./src
嗎?
嘗試
db = Display.getInstance().openOrCreate("./src/MyDb.db");
或使用絕對文件名打開:
db = Display.getInstance().openOrCreate("/path/to/src/MyDb.db");
您可以嘗試此cn1lib https://github.com/shannah/cn1-data-access-lib
我用過它,它很吸引人,除了不能在同一查詢中為2個表工作,而且不能執行刪除操作。
干杯
感謝所有輸入人員。
不幸的是,沒有任何建議對我有用。 但是我確實解決了它。
原來,我的主目錄中有一個名為“ .cn1 / database”的文件夾。 將數據庫放入此文件夾后,它便開始工作。
兩件事:1]如果數據庫不存在,它將創建它並將其放置到該目錄中2]數據庫在Netbeans中未顯示任何地方(無論如何我還是看不到)
再次感謝
從開發人員指南中 :
一些SQLite應用附帶“現成”數據庫。 我們允許您使用以下代碼替換數據庫文件:
String path = Display.getInstance().getDatabasePath(“databaseName”);
然后,您可以使用FileSystemStorage類將數據庫文件的內容寫入路徑。 請注意,它必須是有效的SQLite文件!
重要說明: Javascript端口不支持getDatabasePath()。 它將始終返回null。
這對於需要與中央服務器同步的應用程序或作為其核心產品一部分的大型數據庫附帶的應用程序非常有用。
您依賴模擬器中有意義的路徑,在設備中需要將資源復制到位置。 查看實施此功能的SQL演示: https : //www.codenameone.com/blog/sql-demo-revisited.html
將數據庫文件放入src文件夾后,使用以下代碼將數據庫復制到Codenameone存儲,運行后數據庫將復制到目錄“ .cn1 / database”
String DB_NAME = "DBNAME.db";
Database temp_db = Database.openOrCreate(DB_NAME); //To create an empty file before copy, otherwise Android will throw file not found exception
temp_db.close();
String p = Database.getDatabasePath(DB_NAME);
OutputStream o = FileSystemStorage.getInstance().openOutputStream(p);
InputStream i = Display.getInstance().getResourceAsStream(getClass(), "/" + DB_NAME);
Util.copy(i, o);
這似乎不是一個完整的答案。
我正在演示,似乎缺少了一些東西:
生成任務不應該將此數據庫資源復制到正確的目標文件夾嗎? 否則部署將如何工作? (如果數據庫沒有打包,那么它將如何部署?)沒有它,應用程序將無法運行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.