错误:
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的列
您似乎稍后在数据库中添加了一些列。我确实同意 Ken Wolf 的观点,您应该考虑卸载并重新安装您的应用程序。一种更好的方法是,在
onUpdate
方法中删除并重新创建所有表,并在每次更改架构时增加数据库版本。
好吧,如果您对创建表的语法有信心,那么它可能会发生 当您在同一个表中添加新列时,为此...
1) 从您的设备卸载并再次运行。
或
2) 设置 -> 应用程序 -> 清除数据
或
3)更改“DatabaseHandler”类中的 DATABASE_NAME (我遇到了同样的问题。但我通过更改 DATABASE_NAME 成功了。)
或
4)更改“DatabaseHandler”类中的 DATABASE_VERSION (如果您添加了新列,它会自动升级)
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
正如 Benil 在上面的评论中所说,更改数据库版本号并再次运行代码。
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时使用。
尝试从“设置”中“清除应用程序的数据”。 对我来说,出现这个问题是因为我将数据存储在 SD 卡上,后来我添加了一些列。 因此,如果您保存在 SD 卡上,请删除以前的数据。
对于那些有类似问题并且上述解决方案不起作用的人,请检查 2 件事:
列名和数据类型之间的空格,如
COLUMN_NUMBER+" TEXT PRIMARY KEY) not COLUMN_NUMBER+"TEXT PRIMARY KEY)
创建表时的列顺序应与插入数据的映射相同,如
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,"
这是您的查询..尝试一下。
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);";
如果您在创建查询时犯了错误,然后修复它,
所以在文件系统中你有一个数据库,但是这个数据库可能没有这样的列。
解决方案: 在模拟器中找到一个数据库文件:data/data/com.somecompany.yourapp/databases/db 并将其删除,然后重试。
也可以在某些sql资源管理器中打开此文件并检查是否存在该列。
我遇到了同样的问题,因为我在测试阶段用新列更新了 sqlite 中的数据库表。
除了上面已经给出的答案之外,我发现对于更新 SQLite 数据库(例如更改后)真正有用的是 ABD Idea,一个 AndroidStudio 插件,它允许您:
您可以像这样指定版本:
private static final int VERSION = 4;
如果您确定代码没问题,请尝试卸载该应用程序,然后重新运行它。这解决了我的问题。希望有帮助
也可能使用不同版本的数据库(不是最好的解决方案),例如:
public static final int DATABASE_VERSION = 2;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
它对我有用。
从手机设置中清除应用程序数据在我的情况下有效。 无论是在 Android 模拟器中,您都可以执行相同的操作。
当前代码是
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 方法会检查数据库版本并更改表
有时会出现版本问题,所以也更改版本
https://googlewebhub.in/category/tech/
stackoverflow 的所有最佳解决方案
我知道我已经很晚回复这个问题了,但也许有人可以用这个答案解决她的问题。 您稍后会将一些数据放入表数据库中,因此最好的解决方案是重新命名您的数据库名称。
卸载您的应用程序并重新安装您的应用程序,之后它将正常工作