代号一:SQLite连接错误

时间:2016-03-11 12:58:31

标签: sqlite database-connection codenameone

我正在尝试将SQLite数据库(保存在app文件夹中)连接到选择器组件(接受字符串)。以下是我使用的代码(之前建议):

Database db = null;
Cursor cur = null;
try {
    db = Display.getInstance().openOrCreate("FoodAndBeverage.db");
    if(selectItem.getText().startsWith("Still Water")) {
        cur = db.executeQuery(selectItem.getText());
        int columns = cur.getColumnCount();
        addItem.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);
                addItem.add(BorderLayout.CENTER, new Table(new DefaultTableModel(columnNames, arr)));
            } else {
                addItem.add(BorderLayout.CENTER, "Query returned no results");
            }
        } else {
            addItem.add(BorderLayout.CENTER, "Query returned no results");
        }
    } else {
        db.execute(selectItem.getText());
        addItem.add(BorderLayout.CENTER, "Query completed successfully");
    }
    addItem.revalidate();
} catch(IOException err) {
    Log.e(err);
    addItem.removeAll();
    addItem.add(BorderLayout.CENTER, "Error: " + err);
    addItem.revalidate();
} finally {
    Util.cleanup(db);
    Util.cleanup(cur);
}

但是,我收到以下错误消息:

WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (near ".": syntax error)
[EDT] 0:0:0,0 - Exception: java.io.IOException - [SQLITE_ERROR] SQL error or missing database (near ".": syntax error)
at org.sqlite.DB.newSQLException(DB.java:886)
at org.sqlite.DB.newSQLException(DB.java:897)
at org.sqlite.DB.throwex(DB.java:864)
at org.sqlite.NativeDB.prepare(Native Method)
at org.sqlite.DB.prepare(DB.java:207)
at org.sqlite.PrepStmt.<init>(PrepStmt.java:50)
at org.sqlite.SQLiteConnection.prepareStatement(SQLiteConnection.java:616)
at org.sqlite.SQLiteConnection.prepareStatement(SQLiteConnection.java:606)
at org.sqlite.SQLiteConnection.prepareStatement(SQLiteConnection.java:578)
at com.codename1.impl.javase.SEDatabase.execute(SEDatabase.java:90)
at com.mycompany.myapp.MyApplication.AddItem(MyApplication.java:88)
at com.mycompany.myapp.MyApplication.start(MyApplication.java:145)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.codename1.impl.javase.Executor$1$1.run(Executor.java:100)
at com.codename1.ui.Display.processSerialCalls(Display.java:1147)
at com.codename1.ui.Display.mainEDTLoop(Display.java:966)
at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
java.io.IOException: [SQLITE_ERROR] SQL error or missing database (near ".": syntax error)
at com.codename1.impl.javase.SEDatabase.execute(SEDatabase.java:94)
at com.mycompany.myapp.MyApplication.AddItem(MyApplication.java:88)
at com.mycompany.myapp.MyApplication.start(MyApplication.java:145)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.codename1.impl.javase.Executor$1$1.run(Executor.java:100)
at com.codename1.ui.Display.processSerialCalls(Display.java:1147)
at com.codename1.ui.Display.mainEDTLoop(Display.java:966)
at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.codename1.impl.javase.Executor$1$1.run(Executor.java:100)
at com.codename1.ui.Display.processSerialCalls(Display.java:1147)
at com.codename1.ui.Display.mainEDTLoop(Display.java:966)
at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
Caused by: java.lang.IllegalStateException: Layout doesn't support adding with arguments: com.codename1.ui.layouts.BoxLayout
at com.codename1.ui.layouts.Layout.addLayoutComponent(Layout.java:64)
at com.codename1.ui.Container.addComponent(Container.java:525)
at com.codename1.ui.Container.add(Container.java:172)
at com.codename1.ui.Container.add(Container.java:201)
at com.mycompany.myapp.MyApplication.AddItem(MyApplication.java:95)
at com.mycompany.myapp.MyApplication.start(MyApplication.java:145)
... 9 more

这可能是由于应用无法识别数据库。为了澄清,需要保存数据库文件的位置?我目前已将文件保存在app文件夹中。 View of app folder showing where the database file (highlighted) is saved.

1 个答案:

答案 0 :(得分:0)

这不是存储数据库的正确位置。如果您需要随应用附带的数据库,例如来自here

  

一些SQLite应用程序附带一个&#34;现成的&#34;数据库。我们允许你   使用代码替换DB文件:

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

然后,您可以使用FileSystemStorage类来编写内容   你的DB文件进入路径。请注意,它必须是有效的SQLite   文件!

物理位置位于users home目录中的.cn1目录下。您的操作系统的java.home值。