46

我收到这个错误 - 07-03 12:29:18.643: E/SQLiteLog(5181): (1) table accounts has no column named otherNotes

这是我的代码:

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "accountsManager";
private static final String TABLE_ACCOUNTS = "accounts";

private static final String KEY_ID = "id";
private static final String KEY_TITLE = "title";
private static final String KEY_USERID = "userId";
private static final String KEY_PASSWORD = "password";
private static final String KEY_LOGINURL = "loginUrl";
private static final String KEY_OTHERNOTES = "otherNotes";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public void onCreate(SQLiteDatabase db) {
    String CREATE_ACCOUNTS_TABLE = "CREATE TABLE " + TABLE_ACCOUNTS + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TITLE + " TEXT,"
            + KEY_USERID + " TEXT," + KEY_PASSWORD + " TEXT," + KEY_LOGINURL + " TEXT,"
            + KEY_OTHERNOTES + " TEXT" + ");";
db.execSQL(CREATE_ACCOUNTS_TABLE);
}


public void addAccount(AccountDetails account) {
    SQLiteDatabase db = this.getWritableDatabase();
    System.out.println("Hello!");   


    ContentValues values = new ContentValues();
    values.put(KEY_TITLE, account.getTitle()); // Account Title
    values.put(KEY_USERID, account.getUserId()); // account userid
    values.put(KEY_PASSWORD, account.getPassword()); // account password
    values.put(KEY_LOGINURL, account.getLoginUrl()); // account loginurl
    values.put(KEY_OTHERNOTES, account.getOtherNotes()); // account othernotes
    Log.v("title", KEY_TITLE);


    // Inserting Row
    db.insert(TABLE_ACCOUNTS, null, values);
    db.close(); // Closing database connection
}

另外,当我删除以下语句时:

values.put(KEY_OTHERNOTES, account.getOtherNotes()); // account othernotes

然后我遇到同样的密码问题......等等。即,(1)表帐户没有名为密码的列

请帮忙!!

4

16 回答 16

91

您似乎稍后在数据库中添加了一些列。我同意 Ken Wolf 的观点,您应该考虑卸载并重新安装您的应用程序。一种更好的方法是,删除并重新创建onUpdate方法中的所有表,并在每次更改架构时增加数据库版本。

于 2013-07-03T07:42:15.433 回答
24

好吧,如果您对创建表的语法有信心,那么当您在同一个表中添加新列时可能会发生这种情况......

1)从您的设备中卸载并再次运行它。

或者

2) 设置 -> 应用程序 -> ClearData

或者

3)在“DatabaseHandler”类中更改 DATABASE_NAME (我遇到了同样的问题。但我通过更改 DATABASE_NAME 成功了。)

或者

4)更改“DatabaseHandler”类中的 DATABASE_VERSION (如果添加了新列,它将自动升级)

public DatabaseHandler(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
于 2015-07-24T08:41:03.413 回答
4

正如 Benil 在上面的评论中所说,更改数据库版本号并再次运行代码。

于 2013-11-07T01:58:48.683 回答
4

SQL 代码看起来不错。我认为您忘记调用open()您创建的数据库对象。

将此方法添加到您的 SQL 类:

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;

public DataBaseMain open() throws SQLException{ 
    // Open the database to make her writeable, must be called before writing 
    // to database

    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

public void close(){                
    // Closing the database for writing, avoids error.
    ourHelper.close();
}

并在您想称呼您为 DB 时使用。

于 2013-07-03T07:35:32.933 回答
3

对于那些有类似问题且上述解决方案无效的人,请检查两件事:

  1. 列名和数据类型之间的空格,如

     COLUMN_NUMBER+" TEXT PRIMARY KEY) not  COLUMN_NUMBER+"TEXT PRIMARY KEY)
    
  2. 创建表期间的列顺序应与数据插入的映射相同,例如

    ContentValues values = new ContentValues();
    values.put(TEST_ID, testId);
    values.put(CLASS_NAME, className);
    values.put(SUBJECT, subject);
    
    "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + TEST_ID + " INTEGER,"
                + CLASS_NAME + " TEXT,"
                + SUBJECT + " TEXT,"
    
于 2018-10-30T19:02:19.263 回答
3

从设置中尝试“清除数据”您的应用程序。对我来说,出现这个问题是因为我在 SD 卡上存储数据,后来我添加了一些列。因此,如果您要保存在 SD 卡上,请删除以前的数据。

于 2016-01-15T13:27:47.513 回答
2

这是您的查询..试试这个。

 String CREATE_ACCOUNTS_TABLE = "CREATE TABLE "+TABLE_ACCOUNTS+"(KEY_ID INTEGER PRIMARY KEY,KEY_TITLE TEXT,KEY_USERID TEXT,KEY_PASSWORD TEXT,KEY_LOGINURL TEXT,KEY_OTHERNOTES TEXT);";
于 2013-07-03T07:29:08.473 回答
2

如果您在创建查询中犯了错误然后修复它,这是可能的,

所以在文件系统中你有一个数据库,但是这个数据库可能没有这样的列。

解决方案:在模拟器中找到一个db文件:data/data/com.somecompany.yourapp/databases/db 并删除它,然后重试。

也可以在某些 sql explorer 中打开该文件并检查是否有该列。

于 2014-06-21T14:58:54.337 回答
2

我遇到了同样的问题,因为我在测试阶段用新列更新了 sqlite 中的数据库表。

除了上面已经给出的答案之外,我发现更新 SQLite 数据库(例如更改后)真正有用的是ABD Idea,这是一个 AndroidStudio 插件,它允许您:

  1. 卸载应用
  2. 项目清单
  3. 杀死应用程序
  4. 启动应用
  5. 重启应用
  6. 清除应用数据
  7. 清除应用数据并重新启动
于 2018-07-09T00:12:48.657 回答
1

如果您确定您的代码没问题,只需尝试卸载该应用程序,然后重新运行它。这解决了我的问题。希望它有所帮助

于 2018-03-29T09:04:48.463 回答
1

您可以像这样指定版本:

private static final int VERSION = 4;
于 2016-11-15T14:09:22.863 回答
0

可能的解决方案(不是最好的)也可以使用不同版本的数据库,例如:

public static final int DATABASE_VERSION = 2;

 public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

这个对我有用。

于 2020-04-29T21:27:47.403 回答
0

在我的情况下,从手机设置中清除应用数据。无论是在 android 模拟器中,你都可以这样做。

于 2022-03-04T12:24:13.737 回答
-1

我知道我很晚才回复这个问题,但也许有人可以用这个答案解决她的问题。您稍后会将一些数据放入表数据库中,因此最好的解决方案是重命名您的数据库名称。

于 2020-05-07T07:13:53.113 回答
-2

在我的情况下,onCreate() 方法中存在查询语法错误(需要空格 b/w 列名和数据类型 ..见附图)

解决它..我按照这些步骤

  1. 更正您的语法错误
  2. 更改数据库版本号
  3. 从设置中清除应用数据
  4. 再次卸载并运行您的应用程序。] 1 ] 1

希望能帮助到你

于 2020-08-01T13:26:43.843 回答
-3

卸载您的应用程序并重新安装您的应用程序,之后它将正常工作

于 2021-01-18T09:25:36.933 回答