【问题标题】:SQLite: Table X has no column named YSQLite:表 X 没有名为 Y 的列
【发布时间】:2015-07-28 18:58:22
【问题描述】:

我在这里阅读了很多关于上述问题的线程/问题,但似乎没有任何解决方案适合我。这是我的数据库创建:

  public static final String TABLE_CARDS = "cards";
  public static final String COLUMN_ID = "_id";
  public static final String COLUMN_QUESTION = "question";
  public static final String COLUMN_ANSWER = "answer";

  private static final String DATABASE_NAME = "cards.db";
  private static final int DATABASE_VERSION = 1;

  // Database creation sql statement
  private static final String DATABASE_CREATE = "create table "
      + TABLE_CARDS + "(" 
      + COLUMN_ID + " integer primary key autoincrement, " 
      + COLUMN_QUESTION + " text not null, " 
      + COLUMN_ANSWER + " text not null);";

这里我将一个新对象传递给数据库:

 public Card createCard(String question, String answer) {
    ContentValues values = new ContentValues();
    values.put(MySQLiteHelper.COLUMN_QUESTION, question);
    values.put(MySQLiteHelper.COLUMN_ANSWER, answer);

    long insertId = database.insert(MySQLiteHelper.TABLE_CARDS, null,
        values); 

    Cursor cursor = database.query(MySQLiteHelper.TABLE_CARDS,
        allColumns, MySQLiteHelper.COLUMN_ID + " = " + insertId, null,
        null, null, null);
    cursor.moveToFirst();


    Card newCard = cursorToCard(cursor);
    cursor.close();
    return newCard;
  }

编辑:

错误信息:

10-12 07:07:55.503: E/SQLiteDatabase(796): Error inserting answer=testanw question=testqu
10-12 07:07:55.503: E/SQLiteDatabase(796): android.database.sqlite.SQLiteException: table cards has no column named answer (code 1): , while compiling: INSERT INTO cards(answer,question) VALUES (?,?)
10-12 07:07:55.503: E/SQLiteDatabase(796):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
10-12 07:07:55.503: E/SQLiteDatabase(796):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
10-12 07:07:55.503: E/SQLiteDatabase(796):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
10-12 07:07:55.503: E/SQLiteDatabase(796):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
10-12 07:07:55.503: E/SQLiteDatabase(796):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
10-12 07:07:55.503: E/SQLiteDatabase(796):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
10-12 07:07:55.503: E/SQLiteDatabase(796):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)

问题是,一旦我想写入数据库,它就会抛出这个错误。我想在我的卡片数据库中存储一个名为问题和答案的字符串。很抱歉错过了这些信息!!

【问题讨论】:

  • 你能发布错误信息吗?
  • “上面说的问题”...上面是什么?
  • @Bhushan aahh... - 无论如何 - 正如所提到的错误消息和对预期内容的简要解释将使我们走得很远;-)
  • 卸载并重新安装您的应用程序,或单击“设置”中其条目上的“清除数据”。
  • 嗨,我添加了一些信息。您需要更多信息吗?

标签: android sqlite


【解决方案1】:

卸载您的应用并重新安装。您之前可能已创建过此表,并且此列在您的应用的早期版本中不存在。

当您添加列并且不使用onUpdate 方法时,现有表不会添加新列。这并不是说您在开发过程中每次更改架构时都应该使用onUpdate - 当您实际发布应用程序的新版本时应该使用onUpdate

【讨论】:

  • 谢谢!重新安装应用程序修复了它。我在创建表的 SQL 语句中缺少一个空格,发现了该错误并修复了它。但是我没有重新安装。谢谢!
  • @Szymon 重新安装应用程序解决了我的问题。谢谢。
  • “卸载你的应用程序并重新安装”对我有用......但在 iOS 和 swift 3. 无论你是什么平台......这个解决方案无论如何都有效
【解决方案2】:

当您不使用 onUpdate() 方法时,每次在表中添加新列时只需更改数据库的名称。

【讨论】:

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