首页 > 解决方案 > 数据库不存储数据。我从 Android Studio 日志中得到“SQLiteLog: (1) near "Name": syntax error"

问题描述

在调用 addPatient() 方法并且 addPatient() 方法给出的数据未存储在数据库中之后,我从“SQLiteLog: (1) near "Name": syntax error" 中得到。起初,我怀疑我的“CREATE TABLE”查询可能有问题,但我已经尝试了所有方法,但我无法找出问题所在。

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        //===============Create a table for Patient
        String query = "CREATE TABLE TABLE_PATIENT (COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "COLUMN_USERNAME TEXT, " +
                "COLUMN_PASSWORD TEXT, " +
                "COLUMN_FIRSTNAME TEXT, " +
                "COLUMN_LASTNAME TEXT, " +
                "COLUMN_AGE TEXT, " +
                "COLUMN_GENDER TEXT, " +
                "COLUMN_PHONE TEXT, " +
                "COLUMN_ADDRESS TEXT);";

        db.execSQL(query);
    }//End of onCreate()


    //Add a new Patient Row to the database
    public void addPatient(Patient patient)
    {
Log.i(TAG, "addPatient("+patient.getUserName()+")");
        ContentValues values = new ContentValues();
        values.put(COLUMN_ID, patient.getU_Id());
        values.put(COLUMN_USERNAME, patient.getUserName());
        values.put(COLUMN_PASSWORD, patient.getPassword());
        values.put(COLUMN_FIRSTNAME, patient.getFirstName());
        values.put(COLUMN_LASTNAME,patient.getLastName());
        values.put(COLUMN_AGE, patient.getAge());
        values.put(COLUMN_GENDER,patient.getGender());
        values.put(COLUMN_PHONE,patient.getPhoneNumber());
        values.put(COLUMN_ADDRESS, patient.getAddress());

        SQLiteDatabase db = getWritableDatabase();
try
{
    db.insert(TABLE_PATIENT, null, values);
    db.close();
}catch (Exception e)
{
    Log.i(TAG, e.getMessage());
}

    }//End of addPatient()

标签: javaandroidsqlsqlite

解决方案


我猜你已经定义了这些变量:

String COLUMN_ID = "id";
String COLUMN_USERNAME = "username";
....................................

或类似的东西。
如果列名中有空格,则必须在它们周围使用方括号或反引号,例如:

String COLUMN_USERNAME = "[user name]";

在您的CREATE TABLE语句中,您将列名定义为:

"COLUMN_ID", "COLUMN_USERNAME", ....

因为您使用变量名而不是它们的值。
但是在addPatient()方法中,您ContentValues通过使用它们的实际名称将值赋给对象。
为了解决您的问题,首先从您正在测试它的设备上卸载该应用程序,以便删除数据库。
然后像这样更改CREATE TABLE语句:

String query = "CREATE TABLE " + TABLE_PATIENT +" (" + 
        COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
        COLUMN_USERNAME + " TEXT, " +
        COLUMN_PASSWORD + " TEXT, " +
        COLUMN_FIRSTNAME + " TEXT, " +
        COLUMN_LASTNAME + " TEXT, " +
        COLUMN_AGE + " TEXT, " +
        COLUMN_GENDER + " TEXT, " +
        COLUMN_PHONE + " TEXT, " +
        COLUMN_ADDRESS + " TEXT)";

并重新运行以使用正确的列名重新创建数据库。


推荐阅读