SQLite数据库更新导致错误

网络代理

我是Android的新手,正在开发一个应用程序,该应用程序应该从相机中检索数据并将其存储到SQlite数据库中。不幸的是,数据库更新无法正常工作,因此任何提示或评论将不胜感激。

这是代码:

package de.die_web_agenten.www.runinstant;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;

import de.die_web_agenten.www.runinstant.db.TaskContract;
import de.die_web_agenten.www.runinstant.db.TaskDBHelper;


public class AndroidBarcodeQrExample extends Activity {
    /** Called when the activity is first created. */

    static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
    private ListAdapter listAdapter;
    private TaskDBHelper helper;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_barcode);
    }

    public void scanBar(View v) {
        try {
            Intent intent = new Intent(ACTION_SCAN);
            intent.putExtra("SCAN_MODE", "PRODUCT_MODE");
            startActivityForResult(intent, 0);
        } catch (ActivityNotFoundException anfe) {
            showDialog(AndroidBarcodeQrExample.this, "No Scanner Found", "Download a scanner code activity?", "Yes", "No").show();
        }
    }

    public void scanQR(View v) {
        try {
            Intent intent = new Intent(ACTION_SCAN);
            intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
            startActivityForResult(intent, 0);
        } catch (ActivityNotFoundException anfe) {
            showDialog(AndroidBarcodeQrExample.this, "No Scanner Found", "Download a scanner code activity?", "Yes", "No").show();
        }
    }

    private static AlertDialog showDialog(final Activity act, CharSequence title, CharSequence message, CharSequence buttonYes, CharSequence buttonNo) {
        AlertDialog.Builder downloadDialog = new AlertDialog.Builder(act);
        downloadDialog.setTitle(title);
        downloadDialog.setMessage(message);
        downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int i) {
                Uri uri = Uri.parse("market://search?q=pname:" + "com.google.zxing.client.android");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                try {
                    act.startActivity(intent);
                } catch (ActivityNotFoundException anfe) {

                }
            }
        });
        downloadDialog.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int i) {
            }
        });
        return downloadDialog.show();
    }

    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,TaskContract.Columns._id,
                         TaskContract.Columns.DATE},
                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, TaskContract.Columns._id},
                new int[]{R.id.taskTextView},
                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 db = helper.getWritableDatabase();
                ContentValues values = new ContentValues();
                //values.clear();
                values.put(TaskContract.Columns.SCAN_RESULT, contents);
                values.put(TaskContract.Columns.SCAN_RESULT_FORMAT, format);
                db.insertWithOnConflict(TaskContract.TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE);
                //Toast toast = Toast.makeText(this, "Content:" + contents + " Format:" + format, Toast.LENGTH_LONG);
                //toast.show();
                /*Intent SecondIntent = new Intent(AndroidBarcodeQrExample.this, SecondListActivity.class);
                SecondIntent.putExtra("SCAN_RESULT", contents);
                startActivity(SecondIntent);*/
                //Intent SecondIntent = new Intent(getBaseContext(), SecondListActivity.class);
                //intent.putExtra("SCAN_RESULT", contents);
                //intent.putExtra("SCAN_RESULT_FORMAT", format);
                //Intent i = new Intent(this,  SecondListActivity.class);
                //startActivityForResult(i, 1);
                //startActivity(SecondIntent);
                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;
    }

}

这是TaskDBHelper类:

package de.die_web_agenten.www.runinstant.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class TaskDBHelper extends SQLiteOpenHelper {

    public TaskDBHelper(Context context) {
        super(context, TaskContract.DB_NAME, null, TaskContract.DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqlDB) {
        String sqlQuery =
                String.format("CREATE TABLE %s (" +
                        "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "%s TEXT, %s TEXT)",
                                    TaskContract.TABLE,
                                    TaskContract.Columns.SCAN_RESULT,
                                    TaskContract.Columns.SCAN_RESULT_FORMAT
                                    );
        Log.d("TaskDBHelper", "Query to form table: " + sqlQuery);
        sqlDB.execSQL(sqlQuery);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqlDB, int i, int i2) {
        sqlDB.execSQL("DROP TABLE IF EXISTS "+TaskContract.TABLE);
        onCreate(sqlDB);
    }
}

这是TaskContract类:

    package de.die_web_agenten.www.runinstant.db;

    public class TaskContract {
        public static final String DB_NAME = "de.die_web_agenten.www.runinstant";
        public static final int DB_VERSION = 1;
        public static final String TABLE = "VALUES";


        public static class Columns {
            public static final String SCAN_RESULT = "SCAN_RESULT";
            public static final String SCAN_RESULT_FORMAT = "SCAN_RESULT_FORMAT";
            //public static final String DATE = "date";
            public static final String _id = "_id";
        }
    }

Here´s the TaskDBHelper class: 

package de.die_web_agenten.www.runinstant.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class TaskDBHelper extends SQLiteOpenHelper {

    public TaskDBHelper(Context context) {
        super(context, TaskContract.DB_NAME, null, TaskContract.DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqlDB) {
        String sqlQuery =
                String.format("CREATE TABLE %s (" +
                        "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "%s TEXT, %s TEXT)",
                                    TaskContract.TABLE,
                                    TaskContract.Columns.SCAN_RESULT,
                                    TaskContract.Columns.SCAN_RESULT_FORMAT
                                    );
        Log.d("TaskDBHelper", "Query to form table: " + sqlQuery);
        sqlDB.execSQL(sqlQuery);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqlDB, int i, int i2) {
        sqlDB.execSQL("DROP TABLE IF EXISTS "+TaskContract.TABLE);
        onCreate(sqlDB);
    }
}

这是logcat:

08-15 16:55:12.356 15118-15118/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: de.die_web_agenten.www.runinstant, PID: 15118
                                                   java.lang.RuntimeException: Unable to resume activity {de.die_web_agenten.www.runinstant/de.die_web_agenten.www.runinstant.AndroidBarcodeQrExample}: 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 "VALUES": syntax error (code 1): , while compiling: CREATE TABLE VALUES (_id INTEGER PRIMARY KEY AUTOINCREMENT, SCAN_RESULT TEXT, SCAN_RESULT_FORMAT TEXT)
                                                   #################################################################
                                                   Error Code : 1 (SQLITE_ERROR)
                                                   Caused By : SQL(query) error or missing database.
                                                    (near "VALUES": syntax error (code 1): , while compiling: CREATE TABLE VALUES (_id INTEGER PRIMARY KEY AUTOINCREMENT, SCAN_RESULT TEXT, SCAN_RESULT_FORMAT TEXT))
                                                   #################################################################
                                                       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3409)
                                                       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440)
                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2774)
                                                       at android.app.ActivityThread.access$900(ActivityThread.java:177)
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1430)
                                                       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: 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 "VALUES": syntax error (code 1): , while compiling: CREATE TABLE VALUES (_id INTEGER PRIMARY KEY AUTOINCREMENT, SCAN_RESULT TEXT, SCAN_RESULT_FORMAT TEXT)
                                                   #################################################################
                                                   Error Code : 1 (SQLITE_ERROR)
                                                   Caused By : SQL(query) error or missing database.
                                                    (near "VALUES": syntax error (code 1): , while compiling: CREATE TABLE VALUES (_id INTEGER PRIMARY KEY AUTOINCREMENT, SCAN_RESULT TEXT, SCAN_RESULT_FORMAT TEXT))
                                                   #################################################################
                                                       at android.app.ActivityThread.deliverResults(ActivityThread.java:4005)
                                                       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3395)
                                                        ... 11 more
                                                    Caused by: android.database.sqlite.SQLiteException: near "VALUES": syntax error (code 1): , while compiling: CREATE TABLE VALUES (_id INTEGER PRIMARY KEY AUTOINCREMENT, SCAN_RESULT TEXT, SCAN_RESULT_FORMAT TEXT)
                                                   #################################################################
                                                   Error Code : 1 (SQLITE_ERROR)
                                                   Caused By : SQL(query) error or missing database.
                                                    (near "VALUES": syntax error (code 1): , while compiling: CREATE TABLE VALUES (_id INTEGER PRIMARY KEY AUTOINCREMENT, SCAN_RESULT TEXT, SCAN_RESULT_FORMAT TEXT))
                                                   #################################################################
                                                       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.

任何帮助,将不胜感激,谢谢

TR4Android

发生此错误是因为预期占位符String的数量与给定格式Strings的数量不匹配

String应当格式化以下格式(期望6 Strings来填充占位符):

"CREATE TABLE %s (_id INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT)"

您给了它3 Strings:

TaskContract.TABLE, TaskContract.Columns.SCAN_RESULT, TaskContract.Columns.SCAN_RESULT_FORMAT

您仅需要将所需的列名传递给该String.format()方法,就可以了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更新sqlite数据库并使用SimpleCursorAdapter导致UI挂起

来自分类Dev

在sqlite数据库之间复制表qt导致错误

来自分类Dev

更新SQLite数据库

来自分类Dev

更新数据库错误

来自分类Dev

什么导致sqlite数据库中的外键不匹配错误

来自分类Dev

连接到python文件的Sqlite数据库在作为包导入时导致错误

来自分类Dev

SQLite数据库在更新时挂起

来自分类Dev

从SQlite数据库更新图像

来自分类Dev

SQLite 3数据库未更新

来自分类Dev

更新值sqlite数据库

来自分类Dev

更新大型SQLite数据库

来自分类Dev

批量更新大型sqlite数据库

来自分类Dev

SQLite数据库更新未发生

来自分类Dev

SQLite 数据库 - 更新查询

来自分类Dev

更新附加的 sqlite 数据库

来自分类Dev

从数据库更新EF模型导致现有项目正常运行的多重性错误

来自分类Dev

未知的计算机更新导致“无法打开使用先前版本创建的数据库”错误?

来自分类Dev

SQLite数据库未打开错误

来自分类Dev

数据库被锁定错误sqlite ios

来自分类Dev

使用SQLite的Android数据库错误

来自分类Dev

android中的sqlite数据库错误

来自分类Dev

Sqlite数据库连接错误

来自分类Dev

JavaFX ComboBox SQLite数据库错误

来自分类Dev

Android Studio 数据库 SQLite 错误

来自分类Dev

使用python的sqlite数据库错误

来自分类Dev

尝试从 sqlite 数据库更新数据时,Java 中出现 SQL 错误或丢失数据库(接近“.”:语法错误)错误

来自分类Dev

从SQLite数据库读取导致堆栈溢出

来自分类Dev

从SQLite数据库读取导致堆栈溢出

来自分类Dev

错误的数据库记录正在更新