表accounts没有名为otherNotes的列

问题描述 投票:0回答:19

错误:

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

android sqlite android-sqlite
19个回答
93
投票

您似乎稍后在数据库中添加了一些列。我确实同意 Ken Wolf 的观点,您应该考虑卸载并重新安装您的应用程序。一种更好的方法是,在

onUpdate
方法中删除并重新创建所有表,并在每次更改架构时增加数据库版本。


24
投票

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

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

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

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

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

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

4
投票

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


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时使用。


3
投票

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


3
投票

对于那些有类似问题并且上述解决方案不起作用的人,请检查 2 件事:

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

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

2
投票

如果您在创建查询时犯了错误,然后修复它,

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

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

也可以在某些sql资源管理器中打开此文件并检查是否存在该列。


2
投票

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

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

  1. 卸载应用程序
  2. 列出项目
  3. 杀死应用程序
  4. 启动应用程序
  5. 重新启动应用程序
  6. 清除应用程序数据
  7. 清除应用程序数据并重新启动

1
投票

您可以像这样指定版本:

private static final int VERSION = 4;

1
投票

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


0
投票

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

public static final int DATABASE_VERSION = 2;

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

它对我有用。


0
投票

从手机设置中清除应用程序数据在我的情况下有效。 无论是在 Android 模拟器中,您都可以执行相同的操作。


0
投票

当前代码是

override fun onCreate(db: SQLiteDatabase?) {
    val createPWDTable =
        "CREATE TABLE IF NOT EXISTS $tblPassword ($pwdId INTEGER PRIMARY KEY autoincrement,$title TEXT,$email TEXT,$pwd TEXT,$notes TEXT);"
    db!!.execSQL(createPWDTable)
}

现在添加列加密

override fun onCreate(db: SQLiteDatabase?) {
    val createPWDTable =
        "CREATE TABLE IF NOT EXISTS $tblPassword ($pwdId INTEGER PRIMARY KEY autoincrement,$title TEXT,$email TEXT,$pwd TEXT,$encrypted INT,$notes TEXT);"
    db!!.execSQL(createPWDTable)
}

override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
    if (newVersion == 2) {
        val query = "ALTER TABLE $tblPassword ADD COLUMN $encrypted INT DEFAULT '0'"
        db!!.execSQL(query)
    } 
}

这里如果是新用户那么oncreate方法直接创建带有加密值的表。 如果是老用户,那么 onUpgrade 方法会检查数据库版本并更改表


0
投票

有时会出现版本问题,所以也更改版本


0
投票

https://googlewebhub.in/category/tech/

stackoverflow 的所有最佳解决方案


-1
投票

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


-2
投票

就我而言,onCreate() 方法中存在查询语法错误(需要空格黑白列名和数据类型..请参阅附图)

解决它.. 我按照以下步骤操作

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

希望有帮助


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.