2016-12-20 4 views
2

私は自分の/ srcフォルダに置く作業用のsqliteデータベースを持っています。 は私が...Codename OneアプリケーションでSQLiteを使用する

java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such table: MyTable) 
    をその後、コードネーム一つのウェブサイトに行き、私は例を実行して試してみて、私はこのエラーを取得する簡単な選択クエリを実行すると

    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); 
        } 
    

    しかし、彼らのドキュメントの例を踏襲しました

  • は、だから、私は 'openOrCreate' ステートメントを使用している
  • DBを追加した

私はステップを逃したことがありますか?

おかげ

答えて

0

ありがとうございます。

残念ながら、アドバイスのどれも私のために働いていませんでした。 しかし私は最後にそれを解決しました。

私のホームディレクトリには、「.cn1/database」というフォルダがあります。一旦DBをこのフォルダに置くと、それはうまくいった。

2つのこと: 1] DBが存在しない場合、それは、DBはどこにでもNetBeansで表示されません]それを作成し、このディレクトリ 2にそれを配置します(まあ、私はとにかく見ることができないこと)

developer guideから

おかげで再び

+0

imhoは手動でファイルをコピーして症状を解決しますが問題はありません...ファイルはビルドのためにコピーされなければなりません。 –

0

は、あなたが実行時に、あなたの現在の作業ディレクトリが./srcであることSHUREていますか?

絶対ファイル名でオープン

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

か試してみてください:あなたはこのcn1libを試すことができます

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

は、私はそれを使用しているhttps://github.com/shannah/cn1-data-access-lib

、それは動作しません除いて、魅力を作品同じクエリ内に2つのテーブルがあり、削除操作を実行できません。

乾杯

0

"既製" のデータベースを持ついくつかのSQLiteのアプリ船。私たちはあなたのコードを使用して、DBファイルを置き換える に許可:

String path = Display.getInstance().getDatabasePath(“databaseName”);

あなたは、パスに あなたのDBファイルの内容を書き込むために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リソースを正しいターゲットフォルダにコピーしてはいけませんか?さもなければ、展開はどのように機能しますか? (データベースがパッケージ化されていない場合、どのように展開されますか?)なしでアプリケーションを実行する

関連する問題