2013-04-11 3 views
1

Я разрабатываю приложение для Android (используя эмулятор Eclipse и 5554). Когда я выполняю следующий код, кажется, что CREATE TABLE и INSERT работают правильно, но у SELECT есть некоторые проблемы.SQLite SELECT дает исключение Как это исправить?

Считаете ли вы, что проблема возникает из CREATE TABLE и INSERT? или Синтаксис SELECT не прав?

public void onCreateA(SQLiteDatabase db) { 

     System.out.println("On create works"); 

     try { 
      db.execSQL("DROP TABLE IF EXISTS actuator;"); 
      db.execSQL("CREATE TABLE IF NOT EXISTS actuator ("+ 
        "ACTUATOR_ID INT(11) NOT NULL,"+ 
        "ACTUATOR_HW_ID int(11) DEFAULT NULL,"+ 
        "DEVICE_NAME TEXT(45) DEFAULT NULL,"+ 
        "DEVICE_TYPE TEXT(45) DEFAULT NULL,"+ 
        "DEVICE_SUB_TYPE TEXT(45) DEFAULT NULL,"+ 
        "LOCATION_ID INT(11) DEFAULT NULL,"+ 
        "STATUES_VALUE REAL DEFAULT NULL,"+ 
        "MAX_STATUES_VALUE REAL DEFAULT NULL,"+ 
        "MIN_STATUES_VALUE REAL DEFAULT NULL,"+ 
        "PRIMARY KEY (`ACTUATOR_ID`))"); 

      System.out.println("table created now values will be added"); 

      System.out.print("DONE!"); 


     } catch (SQLException e) { 

      System.out.println("table is not created"); 
     } 

     try { 
      db.execSQL("INSERT INTO actuator (ACTUATOR_ID, ACTUATOR_HW_ID, DEVICE_NAME, DEVICE_TYPE, DEVICE_SUB_TYPE, LOCATION_ID, STATUES_VALUE, MAX_STATUES_VALUE, MIN_STATUES_VALUE) " + 
        "VALUES (1, 2, 'Heat Sensor FX615','Heat Sensor', 'Optic Heat Sensor', 4, 6, 7, 8) "); 
      System.out.println("values are added"); 
     } catch (Exception e) { 

      e.printStackTrace(); 
      System.out.println("values are not added"); 
     } 

     try { 
      db.execSQL("SELECT * FROM actuator"); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      System.out.println("not selected"); 
     } 


    } 

но вывод:

04-11 08:49:24.513: I/System.out(1499): **On create works** 
04-11 08:49:24.571: I/System.out(1499): **table created now values will be added** 
04-11 08:49:24.627: I/System.out(1499): **DONE!values are added** 
04-11 08:49:24.513: I/System.out(1499): **On create works** 
04-11 08:49:24.631: W/System.err(1499): android.database.sqlite.SQLiteException: unknown error (code 0): Queries can be performed using SQLiteDatabase query or rawQuery methods only. 
04-11 08:49:24.631: W/System.err(1499):  at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method) 
04-11 08:49:24.631: W/System.err(1499):  at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:727) 
04-11 08:49:24.641: W/System.err(1499):  at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754) 
04-11 08:49:24.641: W/System.err(1499):  at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64) 
04-11 08:49:24.641: W/System.err(1499):  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1665) 
04-11 08:49:24.641: W/System.err(1499):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594) 
04-11 08:49:24.641: W/System.err(1499):  at com.example.databasetryout.DataBaseTryOut.onCreateA(DataBaseTryOut.java:196) 
04-11 08:49:24.641: W/System.err(1499):  at com.example.databasetryout.DataBaseTryOut$3.onClick(DataBaseTryOut.java:75) 
04-11 08:49:24.641: W/System.err(1499):  at android.view.View.performClick(View.java:4204) 
04-11 08:49:24.641: W/System.err(1499):  at android.view.View$PerformClick.run(View.java:17355) 
04-11 08:49:24.641: W/System.err(1499):  at android.os.Handler.handleCallback(Handler.java:725) 
04-11 08:49:24.641: W/System.err(1499):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-11 08:49:24.651: W/System.err(1499):  at android.os.Looper.loop(Looper.java:137) 04-11 08:49:24.651: W/System.err(1499): at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-11 08:49:24.651: W/System.err(1499):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-11 08:49:24.651: W/System.err(1499):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-11 08:49:24.651: W/System.err(1499):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-11 08:49:24.651: W/System.err(1499):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-11 08:49:24.651: W/System.err(1499):  at dalvik.system.NativeStart.main(Native Method) 04-11 08:49:24.651: I/System.out(1499): **not selected** 
04-11 08:49:24.651: I/System.out(1499): **finish** 
+1

-1 для того, чтобы не читать журналы и документацию stacktrace/logcat ... SQLiteException: неизвестная ошибка (код 0): Запросы могут выполняться с использованием запросов SQLiteDatabase или методов rawQuery только ... в любом случае даже для INSERT вы не должны используя 'execSQL' – Selvin

+0

попробуйте использовать executeQuery или что-то в этом роде. читайте здесь http://www.basic4ppc.com/forum/basic4android-updates-questions/16410-sqlite-pragma.html – Elior

ответ

6
db.execSQL("SELECT * FROM actuator"); 

Вы не можете использовать execSQL метод для операторов, которые возвращают данные. Именно из документации

Выполнить один оператор SQL, который не является SELECT, или любой другой SQL оператор, который возвращает данные.

Вы должны использовать метод rawQuery() или query().

Так что для вашего дела, вы можете использовать следующий фрагмент кода для получения данных из базы данных:

String query = "SELECT * FROM actuator"; 
Cursor c = db.rawQuery(query, null); 
if (c != null && c.moveToFirst()) { 
    // do your stuff 
} 

На самом деле, ваш код ничего не делать. Если вы хотите получить данные из db, вам необходимо назначить их курсору с помощью методов, упомянутых выше.

+0

спасибо, чувак. Я понятия не имел о «курсоре». Теперь он работает, очень жаль, что не голосовал из-за недостаточной репутации для голосования. – abidinberkay

+0

@abidinberkay приветствую :) – Sajmon

0

Как вы можете видеть в своем журнале, ошибка: Запросы могут быть выполнены с использованием SQLiteDatabase запроса или только методы rawQuery.

Итак, в android вам нужно использовать SQLiteDatabase или rawQuery. См: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

Пример:

rawQuery("SELECT id, name FROM people WHERE name = ? AND id = ?", new String[] {"David", "2"}); 
0

Ваша проблема в этой строке:

db.execSQL("SELECT * FROM actuator"); 

Вы пытаетесь выполнить SELECT запрос с execSQL методом, однако это запрос, который возвращает результаты, и, следовательно, должны быть выполнены с помощью соответствующего метода. В вашем случае, вы можете сделать это с помощью метода rawQuery:

db.rawQuery("SELECT * FROM actuator", null); 

Стоит отметить, подумал, что этот код не имеет смысла, она ничего не делает, кроме выполнения запроса в базе данных. Вы не увидите никаких результатов, потому что вы даже не присваиваете результаты переменной.

Смежные вопросы