【问题标题】:No such column exists error when inserting into sqlite database插入sqlite数据库时不存在这样的列错误
【发布时间】:2015-05-06 04:54:02
【问题描述】:

我在将记录插入我的应用程序本地数据库时遇到问题。我正在从 Web 服务获取数据并尝试将它们存储在我的应用程序本地 sqlite 数据库中,但我没有收到此类表错误。 这是我用于创建表和插入其中的 DatabaseHelper 类的代码。

private static final String CREATE_MERCHANT_DETAILS = "CREATE TABLE " + TABLE_MERCHANT_DETAILS + 
    " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
    KEY_NAME + " TEXT, " 
    + KEY_LOGO + "TEXT, " 
    + KEY_BACKGROUND + "TEXT, " 
    + KEY_PRODUCT + "TEXT, " 
    + KEY_PRODUCT_ID + "TEXT, " 
    + KEY_TYPE + "TEXT, " 
    + KEY_DENOMINATION + "TEXT);";


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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_MERCHANT_DETAILS);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

    public void insertAMerchant(String name, String logo, String background, String product, String productId, String type, String denomination) {
        database = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_NAME, name);
        contentValues.put(KEY_LOGO, logo);
        contentValues.put(KEY_BACKGROUND, background);
        contentValues.put(KEY_PRODUCT, product);
        contentValues.put(KEY_PRODUCT_ID, productId);
        contentValues.put(KEY_TYPE, type);
        contentValues.put(KEY_DENOMINATION, denomination);
        database.insert(TABLE_MERCHANT_DETAILS, null, contentValues);
    }

【问题讨论】:

  • CREATE_MERCHANT_DETAILS,代码?
  • private static final String CREATE_MERCHANT_DETAILS = "CREATE TABLE " + TABLE_MERCHANT_DETAILS + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NAME + " TEXT, " + KEY_LOGO + "TEXT, " + KEY_BACKGROUND + "TEXT," + KEY_PRODUCT + "TEXT," + KEY_PRODUCT_ID + "TEXT," + KEY_TYPE + "TEXT," + KEY_DENOMINATION + "TEXT);";

标签: android sqlite insert


【解决方案1】:

在CREATE TABLE SQL 中的列名和类型之间添加空格。

卸载您的应用程序,以便删除旧的数据库文件并再次运行您的 onCreate()。

【讨论】:

  • 您的技巧立即对我有用,但现在当我再次运行我的应用程序而不卸载它时,它会再次存储相同的数据库记录并再次从 Web 服务中获取。如何克服这个问题?
  • 不要再次写入相同的记录,或者将UNIQUE约束添加到那些应该具有唯一值的列。
  • 更改架构后,您需要重新创建表,例如卸载应用程序。
  • 每次更改 Schema 时都无需卸载应用程序,您可以增加 DB 版本并实现onUpgrade。我已经在我的答案中添加了如何做的代码。请检查一下。
  • 谢谢@laalto 你帮了我很多。我认为你是一个乐于助人的人。
【解决方案2】:

你的问题标题说,

插入sqlite数据库时不存在这样的列错误

在你的问题中,你说的是,

没有这样的表错误。

如果错误是No such column exists,问题可能是因为

  1. 列名和类型之间的间距
  2. 如果您更改了表架构,则需要增加 DATABASE_VERSION 以反映更改。但是,您需要实现和设置onUpgrade 才能这样做。我在这里添加了代码。

您需要设置onUpgrade 以反映新的更改。你可以这样做,

 @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i2) {

        Toast.makeText(context, "on Upgrade is called", Toast.LENGTH_LONG).show();

        db.execSQL("DROP TABLE IF EXISTS " + TABLE_MERCHANT_DETAILS);
        onCreate(db);
    }

要检查您的 Sql 查询是否有效,请在 DatabaseHelper.

System.out.println(CREATE_MERCHANT_DETAILS);

这将显示查询,您可以准确检查错误的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2019-04-05
    • 2014-03-24
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多