表格accounts没有名为otherNotes的列。

47
错误:
07-03 12:29:18.643: E/SQLiteLog(5181): (1) 表accounts没有名为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) 表 accounts 没有名为 password 的列


3
请提取您的数据库并检查这些表中是否已创建了提到的列。 - CRUSADER
7
可能你正在使用旧版本的数据库。尝试进入设置/应用程序并在应用程序上“清除数据”。或者卸载并重新安装它。 - Ken Wolf
3
将数据库版本号更改并重新运行代码。!! - Benil Mathew
2
只需从设备/模拟器中卸载该应用程序,然后再次运行即可。 - S.D.
1
@BenilMathew 更改版本号起作用了..谢谢! - Harichandan Pulagam
显示剩余3条评论
17个回答

94

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


3
好的,那个方法起作用了。我进入了设置,清除了所有之前的数据。此后它完美地运行了。 谢谢! - Randomly Named User
但是 drop table 会从数据库中删除所有记录。 - Ramesh Bhati
@RameshBhati 是的,它将删除所有记录。如果您想保留这些数据,请创建一个临时表,然后在按照新模式创建主表之后将记录插入其中。请记住,您必须在onUpgrade方法中完成所有这些操作。也许您现在已经自己解决了,只是为了其他人的参考而写。 - sachin garg
@sachingarg 我认为这不是一个合适的解决方案。你可以使用onUpgrade方法并在此处添加列,同时在onCreate方法中也添加列。 - Ramesh Bhati

24

如果您对创建表格的语法感到自信,当您在同一个表格中添加新列时,可能会发生以下情况:

1)卸载设备上的应用并重新运行。

2)设置->应用程序->清除数据

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

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

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

你失去了所有的数据。 - Ramesh Bhati

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();
}

当您需要调用数据库时,请使用此功能。


4

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


3

对于那些有类似问题但上述解决方案未奏效的人,请检查以下两点:

  1. Space between column name and data type like

     COLUMN_NUMBER+" TEXT PRIMARY KEY) not  COLUMN_NUMBER+"TEXT PRIMARY KEY)
    
  2. The order of column during the creation of table should same as map for data insertion like

    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,"
    

3

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


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);";

你能详细说明一下你做了哪些更改以及为什么吗? - Adil Soomro
KEY_USERID、KEY_PASSWORD等都是已经声明的字符串变量。你的代码完全没有意义。 - Benil Mathew
他只需将KEY_ID放入“”中并编写约束条件,因此我们也可以像我展示的那样给出约束条件... 他可以尝试一下.. 我认为他在编写查询时犯了错误。 - Mit Bhatt
您的查询将创建一个带有列名key_id、key_title等的表。但他想要像title、id等这样的列。 - Benil Mathew
他所写的SQL查询语句很好。 - Benil Mathew

2

如果您在创建查询时犯了错误并加以修复,则有可能发生这种情况。

因此,在文件系统中,您有一个数据库,但是该数据库可能没有这样的列。

解决方案:在模拟器中找到一个数据库文件:data/data/com.somecompany.yourapp/databases/db,然后将其删除,再尝试一次。

还可以在某些SQL浏览器中打开此文件并检查是否存在该列。


2
我遇到了同样的问题,在测试阶段更新sqlite数据库表格时添加了新列。
除了以上已经给出的答案,我发现一个非常有用的更新SQLite数据库(例如在更改后)的工具是 ABD Idea,这是一个AndroidStudio插件,它允许你:
  1. 卸载应用程序
  2. 列出项目
  3. 结束应用程序
  4. 启动应用程序
  5. 重新启动应用程序
  6. 清除应用数据
  7. 清除应用数据并重启

1
如果您确定您的代码没问题,只需尝试卸载该应用程序,然后再次运行它。这解决了我的问题。希望能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接