2016-07-06 107 views
0

我已經看過所以發現許多人有這個相同的錯誤,但他們似乎忘記添加列到創建語句或缺少空白,我都不相信我做過。SQLiteException:沒有這樣的列錯誤

我的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); 
} 

謝謝你的人誰可以告訴我爲什麼告訴我列「數量」不被創建,我真的不知道。

+0

您最近是否添加了該列?如果是這樣的話,你必須更新DATABASE版本以強制「更新」並添加該列......另一個選項是卸載你的應用並重新安裝(或者只是刪除它的數據) – W0rmH0le

+0

如果我只是運行它的Android Studio,不應該自動發生? – grassss

+0

如果之前運行並在以後添加該柱,那麼不......這就是爲什麼存在onUpgrade()方法...稍後添加列......但由於您正在調試,它更容易卸載並安裝應用程序aggain – W0rmH0le

回答

2

如果更改模式,您應該增加DATABASE_VERSION以便升級數據庫。