2016-08-22 4 views
-2

Я новичок в Android и работаю над Android-приложением. К сожалению, я получаю сообщение об ошибке при попытке вставить данные из намерений в базу данных SQlite. Я хочу вставить результаты сканирования в базу данных, но я получаю сообщения об ошибках. Я хочу вставить в базу данных два результата сканирования от Intents - SCAN RESULT и SCAN RESULT FORMAT.Ошибка в заявлении SQlite INSERT INTO

Это Logcat:

08-22 12:27:11.141 27724-27724/? E/AndroidRuntime: FATAL EXCEPTION: main 
Process: de.die_web_agenten.www.runinstant, PID: 27724 
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { act=com.google.zxing.client.android.SCAN flg=0x80000 (has extras) }} to activity {de.die_web_agenten.www.runinstant/de.die_web_agenten.www.runinstant.AndroidBarcodeQrExample}: android.database.sqlite.SQLiteException: near "SCANDATA": syntax error (code 1): , while compiling: INSERT INTO SCANDATA SCANDATA SCAN_RESULT_FORMAT 
################################################################# 
Error Code : 1 (SQLITE_ERROR) 
Caused By : SQL(query) error or missing database. 
(near "SCANDATA": syntax error (code 1): , while compiling: INSERT INTO SCANDATA SCANDATA SCAN_RESULT_FORMAT) 
################################################################# 
at android.app.ActivityThread.deliverResults(ActivityThread.java:4005) 
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4048) 
at android.app.ActivityThread.access$1400(ActivityThread.java:177) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1479) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5910) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 
Caused by: android.database.sqlite.SQLiteException: near "SCANDATA": syntax error (code 1): , while compiling: INSERT INTO SCANDATA SCANDATA SCAN_RESULT_FORMAT 
################################################################# 
Error Code : 1 (SQLITE_ERROR) 
Caused By : SQL(query) error or missing database. 
(near "SCANDATA": syntax error (code 1): , while compiling: INSERT INTO SCANDATA SCANDATA SCAN_RESULT_FORMAT) 
################################################################# 
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1093) 
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:670) 
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59) 
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1812) 
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1743) 
at de.die_web_agenten.www.runinstant.AndroidBarcodeQrExample.onActivityResult(AndroidBarcodeQrExample.java:119) 
at android.app.Activity.dispatchActivityResult(Activity.java:6441) 
at android.app.ActivityThread.deliverResults(ActivityThread.java:4001) 
... 10 more 

Это код с заявлением SQLite:

private void updateUI() { 
     helper = new TaskDBHelper(AndroidBarcodeQrExample.this); 
     SQLiteDatabase sqlDB = helper.getReadableDatabase(); 
     Cursor cursor = sqlDB.query(TaskContract.TABLE, 
       new String[]{ TaskContract.Columns.SCAN_RESULT, TaskContract.Columns.SCAN_RESULT_FORMAT}, 
       null, null, null, null, null 
     ); 


     listAdapter = new SimpleCursorAdapter(
       this, 
       R.layout.task_view, 
       cursor, 
       new String[]{TaskContract.Columns.SCAN_RESULT_FORMAT, TaskContract.Columns.SCAN_RESULT}, 
       new int[]{R.id.ScanFormatView, R.id.ScanResultView, R.id.ScanIdView}, 
       0 
     ); 

     this.setListAdapter(listAdapter); 

    } 

    public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     if (requestCode == 0) { 
      if (resultCode == RESULT_OK) { 
       String contents = intent.getStringExtra("SCAN_RESULT"); 
       String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); 
       helper = new TaskDBHelper(AndroidBarcodeQrExample.this); 
       SQLiteDatabase sqlDB = helper.getWritableDatabase(); 

       String sql = String.format("INSERT INTO SCANDATA %s %s ", 
         TaskContract.TABLE, 
         TaskContract.Columns.SCAN_RESULT_FORMAT, 
         TaskContract.Columns.SCAN_RESULT 
       ); 
       sqlDB.execSQL(sql); 
       updateUI(); 


       Toast toast = Toast.makeText(this, "Content:" + contents + " Format:" + format, Toast.LENGTH_LONG); 
       toast.show(); 
       Log.d("ADebugTag", "Value: " + (contents)); 
       Log.d("BDebugTag", "Value: " + (format)); 
       updateUI(); 

      Context context = getApplicationContext(); 
      CharSequence text = "Informationen erfolgreich gespeichert!"; 
      int duration = Toast.LENGTH_SHORT; 
      //Toast toast = Toast.makeText(context, text, duration); 
      } 

     } 

    } 

    public void setListAdapter(ListAdapter listAdapter) { 
     this.listAdapter = listAdapter; 
    } 

Где ошибка в коде? Любые подсказки и помощь были бы очень оценены, спасибо!

+2

Попробуйте отладить код. – RAAAAM

+2

ваш запрос неверен, это просто печать 'INSERT INTO SCANDATA SCANDATA SCAN_RESULT_FORMAT' –

+3

Если вам сложно работать с необработанным SQL, для него есть Java-обертки, такие как' SQLiteDatabase # insert() 'и' ContentValues'. – laalto

ответ

2

Я думаю, что вы, вероятно, хотите сделать, это вставить contents и format к TaskContract.Columns.SCAN_RESULT и TaskContract.Columns.SCAN_RESULT_FORMAT соответственно. Вот как вы должны создать заявление -

String.format("INSERT INTO SCANDATA (%s,%s) VALUES ('%s', '%s')", 
     TaskContract.Columns.SCAN_RESULT, 
     TaskContract.Columns.SCAN_RESULT_FORMAT, 
     contents, 
     format 
); 
+2

Строковые литералы необходимо указывать или предпочтительно передавать как переменные ('?' В SQL и значения в 'Object []' arg). – laalto

+0

Ах! Я всегда скучаю по этому поводу! Благодарю. ;) – aandis

3

Вы написали неправильный синтаксис. Вы должны использовать следующее.

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN);