【问题标题】:Struggling to connect my SQLite db android studio, table has no column to insert努力连接我的 SQLite db android studio,表没​​有要插入的列
【发布时间】:2020-11-29 02:50:20
【问题描述】:

因此,我正在尝试设置我的 SQLite 数据库,但我收到了难以纠正的错误。 See the error log here

有一个被抛出的错误的图像,这是我为我的 DatabaseHelper 设置的代码

我的日志中还收到了一些其他错误,我不确定它们与什么有关 - 任何信息都很好 see the logcat output here

错误代码

  E/SQLiteLog: (1) table my_manager has no column named 
    location_description in "INSERT INTO my_manager(location_name,location_county,location_description) 
    VALUES (?,?,?)"
     2020-11-28 19:56:32.986 5665-5665/? E/SQLiteDatabase: Error inserting location_name=Blarney Stone 
     location_county=Cork location_description=Stone in  big wall
     android.database.sqlite.SQLiteException: table my_manager has no column named location_description 
     (code 1 SQLITE_ERROR): , while compiling: INSERT INTO 
     my_manager(location_name,location_county,location_description) VALUES (?,?,?)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1045)
        a....

这是我的源代码:

public class MyDatabaseHelper extends SQLiteOpenHelper {
 
    private Context context;
    private static final String DATABASE_NAME = "my_manager.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME =  "my_manager";
    private static final String COLUMN_ID = "location_id";
    private static final String COLUMN_LOCATION = "location_name";
    private static final String COLUMN_COUNTY = "location_county";
    private static final String COLUMN_DESCRIPTION = "location_description";


    public MyDatabaseHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = "CREATE TABLE " + TABLE_NAME +
                        " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        COLUMN_LOCATION + " TEXT, " +
                        COLUMN_COUNTY + " TEXT, " +
                        COLUMN_DESCRIPTION + " TEXT );";
        db.execSQL(query);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);


    }

    void addLocation(String location, String county, String description){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();

        cv.put(COLUMN_LOCATION, location);
        cv.put(COLUMN_COUNTY, county);
        cv.put(COLUMN_DESCRIPTION, description);
        long result = db.insert(TABLE_NAME, null, cv);
        if (result == -1){
            Toast.makeText(context, "Failed!" , Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(context, "Added Successfully" , Toast.LENGTH_SHORT).show();
        }

    }

    Cursor readAllData(){
        String query = "SELECT * FROM " + TABLE_NAME;
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = null;
        if(db != null){
            cursor = db.rawQuery(query, null);
        }
        return cursor;
    }
}

【问题讨论】:

  • 看起来不错 - 您是否有可能添加了描述列但没有增加版本?如果有疑问,请重新安装应用程序或升级版本(假设您可以丢失数据 - 这真的是您在升级中想要的吗?)。
  • 谢谢,没有数据会丢失..我如何升级版本/重新安装应用程序?
  • 将 DATABASE_VERSION 设置为 2 - 这就是触发 onUpgrade 被调用的原因。重新安装应用程序只是意味着从模拟器或设备上卸载并使用您当前使用的任何方式重新安装。
  • 所以我记得我的 Gradel 模块包中的一些代码,然后重新安装了应用程序并冷启动,发挥了魅力,谢谢!您介意解释一下存在的问题,以便我从中学习吗?再次感谢!

标签: java android mysql sqlite


【解决方案1】:

当您第一次运行您的应用程序时,onCreate 会被执行,并在第一次执行时设置架构,DATABASE_VERSION 与该架构相关联。

每次在构造函数 (super(context, DATABASE_NAME, null, DATABASE_VERSION);) 中调用 super 时,SQLiteOpenHelper 代码都会查看数据库版本号,如果它大于上次定义的版本号,则调用 onUpgrade。

在最初的开发过程中,当您在首次发布之前添加到应用程序时,通常会更改架构。在这种模式下,您有两种选择:

  1. 每次架构更改(数据丢失)时卸载并重新安装应用程序。这会导致使用与版本关联的新架构再次调用初始 onCreate。
  2. 升级版本(只需要高于以前的版本)并在您可能需要 ALTER TABLE(添加/修改列)或 CREATE TABLE 以添加新表的位置调用 onUpgrade。

第二个选项通常在应用程序已经发布并且需要更改架构(不会丢失数据)时使用。最终用户将收到 App 更新,并调用 onUpdate(因为版本升级),并且任何更改都将应用于他们现有的数据库而不会丢失数据(假设您 onUpgrade 没有故意破坏数据)。

如果初始开发期间的数据丢失不是问题,那么卸载/重新安装选项似乎是最简单的。

如果您只是更改架构而不改变版本,那么基本上不会受到任何影响 - 因此,例如,当您对新列执行查询时,它会抱怨它不存在,因为它从未添加过。

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 2020-06-25
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多