2016-03-11 3 views
1

Я пытаюсь подключить базу данных SQLite (сохраненную в папке приложения) к компоненту подбора (принятие строк). Ниже приведен код, который я использовал (ранее советовали):Codename One: ошибки подключения SQLite

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 

Это может быть связано с приложением, не признавая базу данных. Чтобы уточнить, где необходимо сохранить файл базы данных? Я сохранил файл в папке приложения. View of app folder showing where the database file (highlighted) is saved.

ответ

0

Это не то место, где должна храниться база данных. Если вам нужна база данных, поставляемая с вашим приложением, например. это от here:

Некоторые приложения SQLite поставляются с «готовой» базой данных. Мы позволяем Вам заменить файл базы данных с помощью кода:

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

Вы можете использовать FileSystemStorage класс, чтобы написать содержание файла БД в пути. Обратите внимание, что он должен быть действительным файлом SQLite !

Физическое местоположение находится под каталогом .cn1 в домашней директории пользователей. Значение java.home для вашей ОС.