SQLite Android表不承认数据库更改 - "没有这样的列:类型(代码1):"

时间:2014-12-28 05:15:33

标签: java android string sqlite

我正在尝试向我的SQLite数据库添加一个密钥,但是当我尝试访问新列时,程序会抛出"没有这样的列类型(代码1)"。我在SQLite编辑器中验证了新列实际存在。我错过了什么吗?

解决方案 我的数据库创建没有接受DATABASE_VERSION,我只是将其设置为使用" 1"。一旦我将其设置为使用该变量,并将其从1更改为2,它就更新了我的数据库!

这是我的班级

package com.example.blizz_000.lureorganizer;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.sql.SQLException;

public class LureOrganizer {

  public com.example.blizz_000.lureorganizer.DatabaseHelper ourHelper;
  private final Context ourContext;
  private SQLiteDatabase ourDatabase;

  public static final String KEY_NAME = "model";
  public static final String KEY_MAKER = "company";
  public static final String KEY_SIZE = "size";
  public static final String KEY_COLOR = "color";
  public static final String KEY_TYPE = "TEST";
  public static final String KEY_ROWID = "_id";
  private static final String DATABASE_NAME = "fishing_db";
  private static final String DATABASE_TABLE = "LURES";
  public static int DATABASE_VERSION = 1;


    // DATABASE HELPER CLASS*********************************************************
private static class DatabaseHelper extends SQLiteOpenHelper {

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

    @Override
    public void onCreate(SQLiteDatabase db) {


        db.execSQL("CREATE TABLE " + DATABASE_TABLE +" (" +
                KEY_ROWID +"INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_NAME + " TEXT, " +
                KEY_MAKER + " TEXT, " +
                KEY_COLOR + " TEXT, " +
                "TEST text, " +
                KEY_SIZE + " TEXT);");

        //db.execSQL("ALTER TABLE LURES ADD COLUMN TEST TEST"); // Won't find the table

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }
}
// END DATABASE HELPER CLASS *********************************************************


//*********************BEGIN MY METHODS**************************
    public LureOrganizer(Context c) {
        ourContext = c;}


    //Opens Db
    public LureOrganizer open() throws SQLException{
        ourHelper = new com.example.blizz_000.lureorganizer.DatabaseHelper(ourContext);
        ourDatabase = ourHelper.getWritableDatabase();
        return this;}

    //Opens Db NO EXCEPTION
    public LureOrganizer opennoe() {
        ourHelper = new com.example.blizz_000.lureorganizer.DatabaseHelper(ourContext);
        ourDatabase = ourHelper.getWritableDatabase();
        return this;}


    //Closes Db
    public void close() {
        ourHelper.close();}


    //Entries
    public long createEntry(String name, String maker, String color, String size, String type) {
        ContentValues cv = new ContentValues();
        cv.put(KEY_NAME, name);
        cv.put(KEY_MAKER, maker);
        cv.put(KEY_COLOR, color);
        cv.put(KEY_SIZE, size);
        cv.put(KEY_TYPE, type);
        return ourDatabase.insert(DATABASE_TABLE, null, cv);}






//RETRIEVE ALL PIECES OF THE DATA *****************************************************************************************************//
    //Retrive Data for SINGLE PIECE
   public String[] getData(String id) {
       String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_MAKER, KEY_COLOR, KEY_SIZE};
       Cursor d = ourDatabase.rawQuery("select * from LURES WHERE _id = ?",
               new String[]{id});

       String[] resultarray = new String[5];
       int iName = d.getColumnIndex(KEY_NAME);
       int iMaker = d.getColumnIndex(KEY_MAKER);
       int iColor = d.getColumnIndex(KEY_COLOR);
       int iSize = d.getColumnIndex(KEY_SIZE);
       int iType = d.getColumnIndex(KEY_TYPE);

       for (d.moveToFirst(); !d.isAfterLast(); d.moveToNext()) {
           resultarray[0] = d.getString(iMaker);
           resultarray[1] = d.getString(iName);
           resultarray[2] = d.getString(iColor);
           resultarray[3] = d.getString(iSize);
           resultarray[4] = d.getString(iType);
       }
       return resultarray;
   }

    //Retrieve Data
    public String[] getName() {
        String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_MAKER, KEY_COLOR, KEY_SIZE, KEY_TYPE};
        Cursor d = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
        String result ="";

        String[] resultarray = new String[5];
        int iRow = d.getColumnIndex(KEY_ROWID);
        int iName = d.getColumnIndex(KEY_NAME);
        int iMaker = d.getColumnIndex(KEY_MAKER);
        int iColor = d.getColumnIndex(KEY_COLOR);
        int iSize = d.getColumnIndex(KEY_SIZE);
        int iType = d.getColumnIndex(KEY_TYPE);

        for(d.moveToFirst(); !d.isAfterLast(); d.moveToNext()){
            resultarray[0] = d.getString(iMaker);
            resultarray[1] = d.getString(iName);
            resultarray[2] = d.getString(iColor);
            resultarray[3] = d.getString(iSize);
            resultarray[4] = d.getString(iType);



        }

        return resultarray;
    }

    //CURSOR READER
    public Cursor readEntry() {

        String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_MAKER, KEY_COLOR, KEY_SIZE, KEY_TYPE};
        Cursor d = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
        return d;

    }

    public void DeleteRow(String id) {
        ourDatabase.delete(DATABASE_TABLE, "_id = ?",
                new String[]{id});

   }
}

我知道代码的工作方式不是KEY_TYPE,所以我觉得有必要包含其他类,但如果有帮助的话,我会的。

2 个答案:

答案 0 :(得分:1)

每当你创建数据库打开助手的对象时,它都不会调用该类的onCreate。只有当你第一次调用getWritableDatabse()或getReadableDatabase()时,它才会调用,如果你的应用程序中不存在数据库文件。为什么我这样说是因为你在那边写了一些修改命令。

如果在没有卸载的情况下运行应用程序,那么数据库文件将不会被删除,因此它不会调用该类的oncreate。

在编写与数据库相关的代码时更好地卸载并运行应用程序。

你在id coloumn之后错过了一个空格。

db.execSQL("CREATE TABLE " + DATABASE_TABLE +" (" +
                KEY_ROWID +" INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_NAME + " TEXT, " +
                KEY_MAKER + " TEXT, " +
                KEY_COLOR + " TEXT, " +
                "TEST text, " +
                KEY_SIZE + " TEXT);");

我希望这会对你有所帮助。

答案 1 :(得分:1)

当您更改数据库结构(即:更改表)时,您必须通知它您的数据库已更改。

这是通过将 DATABASE_VERSION 常量设置为更高的值来完成的,即: 2

所以:

public static int DATABASE_VERSION = 2;

这将使onUpgrade()方法触发并重新创建表。

你在KEY_ROWID之后错过了一个空格:

db.execSQL("CREATE TABLE " + DATABASE_TABLE +" (" +
    KEY_ROWID +" INTEGER PRIMARY KEY AUTOINCREMENT, " +
    KEY_NAME + " TEXT, " + KEY_MAKER + " TEXT, " +
    KEY_COLOR + " TEXT, " + "TEST text, " + KEY_SIZE + " TEXT)");