【问题标题】:Data not being inserted into Table using SQLite in Android数据未在 Android 中使用 SQLite 插入到表中
【发布时间】:2015-05-09 12:34:04
【问题描述】:

我想将供应商名称、供应商联系电话、供应商地址插入一个包含 4 列 id、name、number、address 的表中

不幸的是,每次执行都会引发异常。尝试通过代码,logcat。仍然无法找到问题所在。任何形式的帮助都将不胜感激。

Logcat 信息:

03-08 10:46:07.920  28315-28315/com.example.bharathduraiswamy.comboedittext E/SQLiteDatabase﹕ Error inserting supplier address= supplier name= supplier mobile number=
android.database.sqlite.SQLiteException: near "address": syntax error (code 1): , while compiling: INSERT INTO SUPPLIERLIST(supplier address,supplier name,supplier mobile number) VALUES (?,?,?)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:886)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:497)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
        at com.example.bharathduraiswamy.comboedittext.VivzDatabaseAdapter.insertSupplier(VivzDatabaseAdapter.java:92)
        at com.example.bharathduraiswamy.comboedittext.AddSupplier.addSupplier(AddSupplier.java:269)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at android.support.v7.internal.view.SupportMenuInflater$InflatedOnMenuItemClickListener.onMenuItemClick(SupportMenuInflater.java:255)
        at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
        at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:949)
        at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:939)
        at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:596)
        at android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:145)
        at android.view.View.performClick(View.java:4213)
        at android.view.View$PerformClick.run(View.java:17448)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:153)
        at android.app.ActivityThread.main(ActivityThread.java:5336)
        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:833)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)

助手类代码:

    public long insertSupplier(String suppName, String suppNumber, String suppAddress) {
    SQLiteDatabase db = helper.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(VivzHelper.COLUMN_SUPPLIER_NAME, suppName);
    contentValues.put(VivzHelper.COLUMN_SUPPLIER_MOBILE_NUMBER, suppNumber);
    contentValues.put(VivzHelper.COLUMN_SUPPLIER_ADDRESS, suppAddress);
    long supplier_id = db.insert(VivzHelper.TABLE_NAME_SUPPLIER, null, contentValues);
    db.close();
    return supplier_id;
}

供应商列表的表格数据:

        private static final String TABLE_NAME_SUPPLIER = "SUPPLIERLIST";
    private static final String COLUMN_SUPPLIER_UID = "supplier_id";
    private static final String COLUMN_SUPPLIER_NAME = "supplier name";
    private static final String COLUMN_SUPPLIER_MOBILE_NUMBER = "supplier mobile number";
    private static final String COLUMN_SUPPLIER_ADDRESS = "supplier address";
    private static final String CREATE_TABLE_SUPPLIER =
            "CREATE TABLE " + TABLE_NAME_SUPPLIER + "( " + COLUMN_SUPPLIER_UID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                    " " + COLUMN_SUPPLIER_NAME + " VARCHAR(255)," +
                    " " + COLUMN_SUPPLIER_MOBILE_NUMBER + " VARCHAR(255)," +
                    " " + COLUMN_SUPPLIER_ADDRESS + " VARCHAR(255));";

    private static final String DROP_TABLE_SUPPLIER = "DROP TABLE IF EXISTS" + TABLE_NAME_SUPPLIER;

MainActivity.java 中的 addSupplier 方法

   public void addSupplier(MenuItem item) {
    String suppName = supplierName.getText().toString();
    String suppNumber = supplierNumber.getText().toString();
    String suppAddress = supplierAddress.getText().toString();

    long id = vivzHelper.insertSupplier(suppName,suppNumber,suppAddress);
    if (id < 0) {
        Message.message(this, "Inserting a Row was unsuccessful");
    } else {
        Message.message(this, "Successfully inserted a Row");
    }
    //category.setText(""); clears the EditText's existing user fed data
    supplierName.setText("");
    supplierNumber.setText("");
    supplierAddress.setText("");
}

我正在使用操作栏中的菜单项将数据从三个 EditText 传递到 SQLite 数据库。

【问题讨论】:

  • 只是一个观察...您在MainActivity 中将suppName,suppNumber,suppAddress 传递给insertSupplier,但是这些列的错误中提到的顺序不同...
  • 您已经使用了变量之间的空格,您必须删除所有这些空格,例如您必须将 supplier address 更改为 supplier_address
  • 删除表格列名中的空格或在查询中使用双引号
  • 感谢大家指出我在命名表格列时所犯的错误。我将来会投票(现在没有所需的声誉:()

标签: java android sqlite android-activity android-sqlite


【解决方案1】:

只需将您的列名更改为:

 private static final String COLUMN_SUPPLIER_NAME = "supplier_name";
private static final String COLUMN_SUPPLIER_MOBILE_NUMBER = "supplier_mobile_number";
private static final String COLUMN_SUPPLIER_ADDRESS = "supplier_address";

您在列名之间使用了空格。那是你的问题。

【讨论】:

    【解决方案2】:

    我认为你的变量定义不正确

    private static final String TABLE_NAME_SUPPLIER = "SUPPLIERLIST";
    private static final String COLUMN_SUPPLIER_UID = "supplier_id";
    private static final String COLUMN_SUPPLIER_NAME = "supplier_name";
    private static final String COLUMN_SUPPLIER_MOBILE_NUMBER = "supplier_mobile_number";
    private static final String COLUMN_SUPPLIER_ADDRESS = "supplier_address";
    private static final String CREATE_TABLE_SUPPLIER =
            "CREATE TABLE " + TABLE_NAME_SUPPLIER + "( " +COLUMN_SUPPLIER_UID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                    " " + COLUMN_SUPPLIER_NAME + " VARCHAR(255)," +
                    " " + COLUMN_SUPPLIER_MOBILE_NUMBER + " VARCHAR(255)," +
                    " " + COLUMN_SUPPLIER_ADDRESS + " VARCHAR(255));";
    

    插入使用自爆示例代码

    public void addSupplier (Supplier supplier)
    {
                //for logging
        Log.d("add", supplier.toString());
    
         // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
    
        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put(COLUMN_SUPPLIER_NAME, supplier.getSUPPLIER_NAME()); 
        values.put(COLUMN_SUPPLIER_ADDRESS, supplier.getSUPPLIER_ADDRESS());
    
                values.put(COLUMN_SUPPLIER_MOBILE_NUMBER, supplier.getSUPPLIER_MOBILE_NUMBER());
    
        // 3. insert
        db.insert(TABLE_NAME_SUPPLIER, // table
                null, //nullColumnHack
                values); // key/value -> keys = column names/ values = column values
    
        // 4. close
        db.close();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多