2016-12-20 33 views
2

我有一個工作的sqlite數據庫,我已經放在我的/ src文件夾中。 我後來去到一個代號網站,跟着他們的文檔例如在Codename One應用程序中使用SQLite

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) 
  • 所以我加入了DB
  • 我已經使用了 'openOrCreate' 語句

我錯過了一步嗎?

感謝

回答

0

感謝所有的輸入傢伙。

不幸的是沒有任何建議爲我工作。 但是我最終解決了它。

事實證明,我的主目錄中有一個名爲'.cn1/database'的文件夾。一旦我將數據庫放入此文件夾中,它就可以工作。

兩件事情: 1]如果該數據庫不存在,那麼它會創建它,並將其放置到這個目錄 2]分貝任何地方都不會在Netbeans中顯示出來(當然不是我能反正見)

再次感謝

+0

imho手動複製文件解決症狀,而不是問題...該文件必須複製爲生成工作,否則每個人運行這將有同樣的問題 –

0

你舒爾,在執行您當前的工作目錄是./src

嘗試

db = Display.getInstance().openOrCreate("./src/MyDb.db"); 

或絕對的文件名開:

db = Display.getInstance().openOrCreate("/path/to/src/MyDb.db"); 
+0

編譯時,代碼是否移出src? –

+0

@ cricket_007'openOrCreate(「MyDb.db」);'嘗試在當前工作目錄中打開。這可以在任何地方,並取決於如何啓動Java。如果來自IDE,它可能是'src'的父目錄,但這只是一個猜測。絕對文件名將始終工作。 – PeterMmm

+0

沒錯。我只知道Eclipse和Intellij創建一個構建/目標文件夾,而類文件不在src文件夾所在的位置,所以相對於代碼,不應該假設資產在那裏。我沒有使用CodenameOne –

0

developer guide

一些SQLite的應用程序附帶一個 「現成的」 數據庫。我們允許你 使用的代碼替換DB文件:

String path = Display.getInstance().getDatabasePath(「databaseName」);

然後,您可以使用FileSystemStorage類寫 您的數據庫文件的內容轉換成路徑。注意它必須是一個有效的SQLite 文件!

重要提示: getDatabasePath()在Javascript端口中不受支持。它 將始終返回null。

這對於需要與 中央服務器或應用程序同步的應用程序非常有用,這些服務器或應用程序隨附大型數據庫,作爲其核心產品的 的一部分。

您正在依靠在模擬器中有意義的路徑,在需要將資源複製到位置的設備中。退房的SQL演示這個地方實現:下面的代碼https://www.codenameone.com/blog/sql-demo-revisited.html

0

使用數據庫複製到放在src文件夾數據庫文件後Codenameone存儲,數據庫將運行

後複製到目錄「.cn1 /數據庫」
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); 
0

這似乎不是一個完整的答案。

我正在通過演示,並且似乎丟失了一些東西:
構建任務不應該將此db資源複製到正確的目標文件夾嗎?否則,部署如何工作? (如果數據庫不打包,那麼它將如何部署?)沒有它的應用程序無法運行

相關問題