【问题标题】:SQLite column error: table XXX has no column named YYYSQLite 列错误:表 XXX 没有名为 YYY 的列
【发布时间】:2019-07-31 23:27:07
【问题描述】:

我查看了以下内容,但没有发现任何与我的问题相匹配的内容(据我所知):

android.database.sqlite.SQLiteException: table X has no column named Y: , while compiling: INSERT INTO

Android : Table has no column named "variable name" MySql Database error

Error compiling insert into: No column named ID

Android SQLite issue - table ... has no column named

https://sqlite.org/foreignkeys.html

我收到以下 SQLite 错误:

SQLiteDatabase: Error inserting zipCode=23456 address2= city=state address1=123 petName=qwerty phoneNumber=null vetName=zaw emailAddress=
                                             android.database.sqlite.SQLiteException: table vets has no column named petName (code 1): , while compiling: INSERT INTO vets (zipCode,address2,city,address1,petName,phoneNumber,vetName,emailAddress) VALUES (?,?,?,?,?,?,?,?)

我感觉这与 VetTable 中的外键有关,但我的研究并没有帮助我理解发生了什么。

VetTable 定义如下:

public class VetTable {
    public static final String TABLE_VETS = "vets";
    public static final String VET_ID = "vetId";
    public static final String PET_ID = "petId";
    public static final String VET_NAME = "vetName";
    public static final String ADDRESS1 = "address1";
    public static final String ADDRESS2 = "address2";
    public static final String CITY = "city";
    public static final String STATE = "state";
    public static final String ZIP_CODE = "zipCode";
    public static final String PHONE_NUMBER = "phoneNumber";
    public static final String EMAIL_ADDRESS = "emailAddress";

public static final String SQL_CREATE =
        "CREATE TABLE " + TABLE_VETS + "(" +
                VET_ID + " INTEGER PRIMARY KEY UNIQUE, " +
                PET_ID + " INTEGER, " +
                VET_NAME + " TEXT, " +
                ADDRESS1 + " TEXT, " +
                ADDRESS2 + " TEXT, " +
                CITY + " TEXT, " +
                STATE + " TEXT, " +
                ZIP_CODE + " TEXT, " +
                PHONE_NUMBER + " TEXT, " +
                EMAIL_ADDRESS + " TEXT, " +
                "FOREIGN KEY(" + PET_ID + ") " +
                "REFERENCES pets(petId));";

    public static final String SQL_DELETE =
            "DROP TABLE" + TABLE_VETS;
}

来自DBHelper代码的相关代码如下:

public void addVetInfo(String name, String address1, String address2, String city, String state, String zip, String phone, String email){
    try {
        db = this.getWritableDatabase();
        values.put(VET_NAME, name);
        values.put(ADDRESS1, address1);
        values.put(ADDRESS2, address2);
        values.put(CITY, city);
        values.put(CITY, state);
        values.put(ZIP_CODE, zip);
        values.put(PHONE_NUMBER, phone);
        values.put(EMAIL_ADDRESS, email);
        db.insert(TABLE_VETS, null, values);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

可以看出,petName 不是 VetTable 的一部分,也从未包含在 VetTable 中,也不是 addVetInfo 中参数列表的一部分。那么,SQLite 做了什么让它认为 petName 应该是 VetTable 中的一列?

【问题讨论】:

  • 有两个put(CITY 调用。无论如何,显示的代码并不是实际执行的代码。
  • CL,你是什么意思?执行了哪些我没有发布的代码?
  • CL,感谢您发现两个“CITY”电话!
  • CL,我刚刚将第二个“CITY”更改为“STATE”并且代码有效!我没有看到重复的列名和错误消息之间有任何联系。
  • 实际执行的应用使用了petName。这段代码没有。因此,您实际上并没有运行问题中的代码。

标签: android database sqlite


【解决方案1】:

当您尝试将数据插入到列名不存在的表中时,或者您尝试插入的架构已被最新的 sequelize.js 代码更改时,可能会发生这种情况。

可能的问题示例:

  • 重命名列名(例如:之前的 ID 和现在的 UUID
  • 新的架构设计或完整的表架构更改
  • 试图将字段名错误的数据(例如:IDS:1234)插入到列名(例如:ID:1234)的表中

【讨论】:

    【解决方案2】:

    对于其他遇到此 SQLite 错误问题的人,我的情况似乎是由于 CL 在我的帖子中指出的列名重复。当我更正它并重新运行代码时,它运行良好,没有错误。

    因此,请确保您的列名对于您的插入语句是正确的。

    【讨论】:

      【解决方案3】:

      看起来您的 values 变量已经在对象中具有该值,请检查:

      public void addVetInfo(String name, String address1, String address2, String city, String state, String zip, String phone, String email){
          try {
              db = this.getWritableDatabase();
              //INITIALIZE YOUR VARIABLE VALUES HERE
              ContentValues values = new ContentValues();
      
          //if(name == "Enter vet name") name = null;
          values.put(VET_NAME, name);
          //if(address1 == "Enter address 1" || address1 == " ") address1 = null;
          values.put(ADDRESS1, address1);
          //if(address2 == "Enter address 2") address2 = null;
          values.put(ADDRESS2, address2);
          //if(city == "Enter city") city = null;
          values.put(CITY, city);
          //if(state == "Enter state") state = null;
          values.put(CITY, state);
          //if(zip == "Enter zip") zip = null;
          values.put(ZIP_CODE, zip);
          //if(phone == "Enter phone number") phone = null;
          values.put(PHONE_NUMBER, phone);
          //if(email == "Enter email address") email = null;
          values.put(EMAIL_ADDRESS, email);
          db.insert(TABLE_VETS, null, values);
      } catch (SQLException e) {
          e.printStackTrace();
      }
      }
      

      【讨论】:

      • 我发现错误是由于我有重复的“CITY”引用引起的,正如 CL 的评论所指出的那样。我无法理解为什么 SQLite 会说它与“petName”有任何关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      相关资源
      最近更新 更多