SQLiteException:接近“XY”:语法错误(代码1):

时间:2016-02-13 22:07:01

标签: android sqlite syntax-error

我想在Android应用程序上尝试一些Sqlite请求,

编辑:我的名字列:

private static final String NOM_BDD = "sms.db";
private static final int VERSION_BDD = 1;

private static final String COL_ID = "ID";
private static final int NUM_COL_ID = 0;

private static final String TABLE_SMS_SENT = "table_sms_sent";
private static final String COL_DateSending = "dateSending";

private static final String TABLE_SMS_RECEIVED = "table_sms_received";
private static final String COL_DateReceiving = "dateReceiving";

private static final int NUM_COL_DateReceiving = 1;

private static final String COL_PROCESSED ="processed";
private static final int NUM_COL_PROCESSED = 2;

private static final String COL_PHONE ="phone";
private static final int NUM_COL_PHONE= 3;

private static final String COL_DATA ="data";
private static final int NUM_COL_DATA= 4;

我的要求就在这里:

private static final String CREATE_BDD_SMS_RECEIVED = "CREATE TABLE " + TABLE_SMS_RECEIVED + " ("
        + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_DateReceiving + " TEXT, "
        + COL_PROCESSED + " TEXT, " + COL_PHONE + "TEXT, " + COL_DATA + "TEXT)"; 

编辑:在'TEXT'之前删除一些空格

private static final String CREATE_BDD_SMS_RECEIVED = "CREATE TABLE " + TABLE_SMS_RECEIVED + " ("
        + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_DateReceiving + "TEXT, "
        + COL_PROCESSED + "TEXT, " + COL_PHONE + "TEXT, " + COL_DATA + "TEXT)"; 

我的myBaseSqlite类的OnCreate就在这里:

@Override
public void onCreate(SQLiteDatabase db) {
    //on créé la table à partir de la requête écrite dans la variable CREATE_BDD sent et received
    db.execSQL(CREATE_BDD_SMS_RECEIVED);
}

然后在我的MainActivity上:

    CSmsReceiverDAO cSmsReceiverDAO = new CSmsReceiverDAO(this);
    CSmsReceived SmsReceived1 = new CSmsReceived.SmsReceivedBuilder().Id(0)
            .Data("coords XY").DateReceiving("janvier").Phone("+33565456").Processed("zz").build();

    cSmsReceiverDAO.open();

    try {
        cSmsReceiverDAO.persist(SmsReceived1);
    } catch (Exception e) {
        e.printStackTrace();
    }

我相信有趣的错误行在这里:

E/SQLiteDatabase: Error inserting zz=2 coords XY=4 janvier=1 +33565456=3

android.database.sqlite.SQLiteException: near "XY": syntax error: , while compiling: INSERT INTO table_sms_received(zz,coords XY,janvier,+33565456) VALUES (?,?,?,?)

编辑:我的持久代码:     @覆盖     public void persist(CSmsReceived t)抛出异常{

    //Création d'un ContentValues (fonctionne comme une HashMap)
    ContentValues values = new ContentValues();
    //on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
    values.put(t.getDateReceiving(), NUM_COL_DateReceiving);
    values.put(t.getProcessed(), NUM_COL_PROCESSED);
    values.put(t.getPhone(), NUM_COL_PHONE);
    values.put(t.getData(), NUM_COL_DATA);

    //on insère l'objet dans la BDD via le ContentValues
    bdd.insert(TABLE_SMS_RECEIVED, null, values);
}

我的OnCreate似乎有效,但我的persist()不起作用,它会出错:

E/SQLiteDatabase: Error inserting zz=2 coords XY=4 janvier=1 +33565456=3
                                                                        android.database.sqlite.SQLiteException: near "XY": syntax error: , while compiling: INSERT INTO table_sms_received(zz,coords XY,janvier,+33565456) VALUES (?,?,?,?)
                                                                            at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
                                                                            at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
                                                                            at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
                                                                            at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
                                                                            at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)
                                                                            at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)
                                                                            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1838)
                                                                            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1711)
                                                                            at com.dev.boblinux.cador.bdd.CSmsReceiverDAO.persist(CSmsReceiverDAO.java:85)
                                                                            at com.dev.boblinux.cador.activities.CMainActivity.onCreate(CMainActivity.java:41)
                                                                            at android.app.Activity.performCreate(Activity.java:4469)
                                                                            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
                                                                            at android.app.ActivityThread.access$600(ActivityThread.java:127)
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                            at android.os.Looper.loop(Looper.java:137)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:4507)
                                                                            at java.lang.reflect.Method.invokeNative(Native Method)
                                                                            at java.lang.reflect.Method.invoke(Method.java:511)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
                                                                            at dalvik.system.NativeStart.main(Native Method)

但是我没看到错误语法在哪里..

感谢您帮助我;)

1 个答案:

答案 0 :(得分:2)

首先:您的CREATE TABLE语句在两个地方的单词TEXT之前缺少空格。这将导致您的表的列名与您定义的常量不同。

第二:您的INSERT声明不正确。括号中的第一组术语应该是列名,而不是您要插入的值。我不知道你的实际列名,但声明看起来应该更像这样:

INSERT INTO table (data, data_receiving, phone, processed) 
    VALUES ('coords XY', '+33565456', 'janvier', 'zz');

或者只是

INSERT INTO table (data, data_receiving, phone, processed) VALUES (?, ?, ?, ?);

修改

构建ContentValues时,values.put()的参数相反。它应该是第一列和第二列,例如

values.put(t.getData(), NUM_COL_DATA); -> value.put(NUM_COL_DATA, t.getData());