SQLiteException:没有这样的列错误

时间:2016-07-06 20:55:08

标签: java android sqlite

我查看了SO并发现很多人都有同样的错误,但他们似乎忘记将列添加到create语句或缺少空格,我相信我都没有。

我的logcat如下:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gmd.referenceapplication, PID: 31988
android.database.sqlite.SQLiteException: no such column: QUANTITY (code 1): , while compiling: SELECT * FROM FTS WHERE (QUANTITY MATCH ?)
  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
  at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:400)
  at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:294)
  at com.gmd.referenceapplication.DatabaseTable.query(DatabaseTable.java:187)
  at com.gmd.referenceapplication.DatabaseTable.getWordMatches(DatabaseTable.java:179)
  at com.gmd.referenceapplication.SearchableActivity$1.onQueryTextChange(SearchableActivity.java:70)
  at android.support.v7.widget.SearchView.onTextChanged(SearchView.java:1150)
  at android.support.v7.widget.SearchView.access$2000(SearchView.java:103)
  at android.support.v7.widget.SearchView$12.onTextChanged(SearchView.java:1680)
  at android.widget.TextView.sendOnTextChanged(TextView.java:7991)
  at android.widget.TextView.handleTextChanged(TextView.java:8053)
  at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:10157)
  at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1033)
  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:559)
  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:492)
  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:491)
  at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:685)
  at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:445)
  at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:340)
  at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:148)
  at android.app.ActivityThread.main(ActivityThread.java:5417)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

DatabaseTable类:

public static final String TAG = "ConstantDatabase";

//the columns included in the table
public static final String COL_QUANTITY = "QUANTITY";
public static final String COL_VALUE = "VALUE";
public static final String COL_UNCERTAINTY = "UNCERTAINTY";
public static final String COL_UNIT = "UNIT";
public static final String _id = "_id";
//name, tbale name, version
private static final String DATABASE_NAME = "CONSTANTS";
private static final String FTS_VIRTUAL_TABLE = "FTS";
private static final int DATABASE_VERSION = 1;


private final DatabaseOpenHelper mDatabaseOpenHelper;
private final Context mcontext;

public DatabaseTable(Context context){
    mDatabaseOpenHelper = new DatabaseOpenHelper(context);
    mcontext = context;
}

private  class DatabaseOpenHelper extends SQLiteOpenHelper {

    private final Context mHelperContext;
    private SQLiteDatabase mDatabase;
    private final MyDataProvider dp = new MyDataProvider(mcontext);

    private static final String FTS_TABLE_CREATE =
            "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE +
                    " USING fts3 (" +_id+ " INTEGER PRIMARY KEY,"+
                    COL_QUANTITY + " TEXT, " +
                    COL_VALUE + " TEXT," +
                    COL_UNCERTAINTY + " TEXT," +
                    COL_UNIT + " TEXT " + ")";

    public DatabaseOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        loadConstants();
        Log.e("Database Operation", "DatabaseOpenHelper constructor called, constants loaded?");
        mHelperContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        mDatabase = db;
        mDatabase.execSQL(FTS_TABLE_CREATE);
        Log.e("Database Operation", "Constants Table Created ...");
        loadConstants();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + FTS_VIRTUAL_TABLE);
        onCreate(db);
    }

    public SQLiteDatabase getmDatabase(){
        return mDatabase;
    }

    private void loadConstants() {
        new Thread(new Runnable() {
            public void run() {
                try {
                    loadConstantss();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();
        Log.e("Loading", "Constants Table Populated ...");
    }

    private void loadConstantss() throws IOException {
        HashMap map = dp.getAllMap();
        Iterator<Map.Entry<String, ListViewItem>> entries = map.entrySet().iterator();
        while (entries.hasNext()) {
            Map.Entry<String, ListViewItem> entry = entries.next();
            Log.d("thing:", entry.getKey());
            //addConstant(entry.getKey(), entry.getValue(), entry.getUncertainty(), entry.getUnit());
        }
    }

    public long addConstant(String quantity, String value, String uncertainty, String unit) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues initialValues = new ContentValues();
        initialValues.put(COL_QUANTITY, quantity);
        initialValues.put(COL_VALUE, value);
        initialValues.put(COL_UNCERTAINTY, uncertainty);
        initialValues.put(COL_UNIT, unit);
        db.insert(FTS_VIRTUAL_TABLE, null, initialValues);
        return db.insert(FTS_VIRTUAL_TABLE, null, initialValues);
    }
    //database openhelper ends
}

public Cursor getWordMatches(String query, String[] columns) {
    String selection = COL_QUANTITY + " MATCH ?";
    String[] selectionArgs = new String[] {query+"*"};
    return query(selection, selectionArgs, columns);
}


public Cursor query(String selection, String[] selectionArgs, String[] columns) {
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(FTS_VIRTUAL_TABLE);

    Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(),
            columns, selection, selectionArgs, null, null, null);

    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;
}

public Cursor getAllTitles(){
    return mDatabaseOpenHelper.getmDatabase().query(FTS_VIRTUAL_TABLE, new String[] {
                    COL_QUANTITY,
                    COL_UNCERTAINTY,
                    COL_UNIT,
                    COL_VALUE},
            null,
            null,
            null,
            null,
            null);
}

感谢所有能告诉我它为什么告诉我“QUANTITY”栏目没有创建的人,我真的不知道。

1 个答案:

答案 0 :(得分:2)

如果更改架构,则应增加DATABASE_VERSION,以便升级数据库。