【问题标题】:Android SQLite issue - table ... has no column namedAndroid SQLite 问题 - 表...没有名为的列
【发布时间】:2022-03-30 13:49:59
【问题描述】:

我收到此错误 - 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)表帐户没有名为密码的列

请帮忙!!

【问题讨论】:

  • 拉出你的数据库并检查是否在这些表中创建了提到的列..
  • 您可能正在使用旧版本的数据库。尝试进入设置/应用程序并在您的应用程序上“清除数据”。或者卸载并重新安装。
  • 更改数据库版本号并再次运行代码。 !!
  • 只需从设备/模拟器中卸载应用程序,然后再次运行。
  • @BenilMathew 更改版本号有效.. 谢谢!

标签: android sqlite android-sqlite


【解决方案1】:

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

【讨论】:

  • 是的,这行得通。我去设置,并清除所有以前的数据。在那之后它工作得很好。谢谢!
  • 但是 drop table 从数据库中删除了我的所有记录
  • @RameshBhati 是的。它将删除所有记录。如果要保留该数据,请创建一个临时表,然后在根据新模式创建主表后,在其中插入记录。请记住,您必须在 onUpgrade 方法中完成所有这些操作。也许你现在已经自己修好了,写在这里供其他人参考。
  • @sachingarg 我的事情,它不是正确的解决方案。您可以使用 onUpgrade 方法并在此处添加列。并且 onCreate 方法也添加了列
【解决方案2】:

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

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

2) 设置 -> 应用 -> ClearData

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

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

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

【讨论】:

  • 您丢失了所有数据
【解决方案3】:

正如 Benil 在 comment above 中所说,更改数据库版本号并再次运行代码。

【讨论】:

    【解决方案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 时使用。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

           COLUMN_NUMBER+" TEXT PRIMARY KEY) not  COLUMN_NUMBER+"TEXT PRIMARY KEY)
          
        2. 创建表时列的顺序应该和map一样用于数据插入

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 你能详细说明你做了哪些改变以及为什么?
          • KEY_USERID,KEY_PASSWORD 等是已经声明的字符串变量。你的代码完全没有意义
          • 他只是把 KEY_ID 和写约束写在 " " 中,所以我们也可以像我展示的那样给出约束..他可以尝试一次..我认为他在写他的查询时犯了错误。
          • 您的查询将创建一个列名称为 key_id、key_title 等的表。但他想要列如 title、id 等
          • 他写的SQL查询没问题。
          【解决方案8】:

          如果你在创建查询时出错然后修复它是可能的,

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

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

          也可以在一些sql explorer中打开这个文件,看看有没有那个列。

          【讨论】:

            【解决方案9】:

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

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

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

            【讨论】:

              【解决方案10】:

              您可以像这样指定版本:

              private static final int VERSION = 4;
              

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

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

                  public static final int DATABASE_VERSION = 2;
                  
                   public DBHelper(Context context) {
                          super(context, DATABASE_NAME, null, DATABASE_VERSION);
                      }
                  

                  它对我有用。

                  【讨论】:

                    【解决方案13】:

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

                    【讨论】:

                    • 这不是正确的方法,而是一种解决方法。正确的实现方法是为数据库创建VERSION。所以我投票结束这个。
                    【解决方案14】:

                    当前代码是

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

                    现在添加 colmn 加密

                    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 方法检查数据库版本并更改表

                    【讨论】:

                      【解决方案15】:

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

                      【讨论】:

                        【解决方案16】:

                        在我的例子中,onCreate() 方法中有一个查询语法错误(需要空格 b/w 列名和数据类型 ..见附图)

                        解决它.. 我遵循了这些步骤

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

                        希望对你有帮助

                        【讨论】:

                          【解决方案17】:

                          卸载你的应用程序并重新安装你的应用程序,然后它就可以工作了

                          【讨论】:

                            猜你喜欢
                            • 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
                            相关资源
                            最近更新 更多