2017-10-15 61 views
0

問題是''​​android.database.sqlite.SQLiteException:表SCHOOLSUBJECT沒有名爲SUBJECT的列(代碼1):'' 我的代碼有什麼問題? 我想把一些數據放入數據庫然後顯示它。列和表 - SQLite

private static final int DATABASE_VERSION = 1; 
public static final String DATABASE_NAME = "SQLiteDatabase.db"; 
public static final String TABLE_NAME = "SCHOOLSUBJECT"; 
public static final String COLUMN_ID = "ID"; 
public static final String COLUMN_FIRST_NAME = "SUBJECT"; 
public SQLiteHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table " + TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_FIRST_NAME + " VARCHAR);"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL(" DROP TABLE IF EXISTS " + TABLE_NAME); 
    onCreate(db); 
} 
public boolean addData(String item) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COLUMN_FIRST_NAME,item); 

    Log.d(" DatabaseHelper","addData: Adding " + item + " to " + TABLE_NAME); 
    long result = db.insert(TABLE_NAME,null,contentValues); 
    db.close(); 
    if(result ==1) 
     return false; 
    else 
     return true 

} 
public String getData() 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null); 

    if (cursor != null) 
     cursor.moveToNext(); 

    String dataa = cursor.getString(1); 

    return dataa; 
} 
} 
+1

請發佈異常的堆棧跟蹤和拋出異常的代碼。另外,嘗試在'create table'語句結尾處刪除分號。 –

+0

您在之前的測試運行之後添加了列或更改了其名稱。 –

+1

嘗試重新安裝您的應用或清除其數據。數據庫將再次生成,也許它會工作。你可以改變你的數據庫@ModularSynth提到 –

回答

0

你的第一個問題,就是SQLiteOpenHelper的子類的onCreate方法僅執行/創建數據庫本身時調用。所以如果結構被改變(例如添加一列,一個表格等)並且改變了onCreate中的代碼,它將不會被自動執行。

當開發一個應用程序和數據並不需要保持一個快速的獲得辦法是刪除該應用程序的數據,卸載應用程序,或者如果多拷貝DROP TABLE(S)和調用的onCreate在編碼方法onUpgrade,增加版本號。

您的第二個問題是因爲db.query方法不會返回空遊標,並且返回的遊標爲空。

如果沒有行匹配條件(在您的情況下是空表),那麼光標計數將爲0,但光標將是有效的。而不是if (cursor != null)使用if (cursor.moveToFirst)if (cursor.moveToNext)if (cursor.getCount() > 0)。在返回使用cursor.close()之前,您還應該關閉光標。

我也建議避免使用硬編碼光標偏移,即你有String dataa = cursor.getString(1);其中被硬編碼後的偏移/指數,你可能會遇到較少的問題,如果你改變這種獲得根據偏移/指數該列的名稱。要做到這一點,你可以使用: -

String dataa = cursor.getString(cursor.getColumnIndex(COLUMN_FIRST_NAME)); 

我也建議改變public static final String COLUMN_ID = "ID";public static final String COLUMN_ID = "_id";。這可能隨後簡化問題,因爲有時需要例如列。如果您使用CursorAdpater作爲ListView(也許您的下一步將列出所有數據)。

更改複製的INTEGER PRIMARY KEY AUTOINCREMENT只是INTEGER PRIMARY KEY也是可取的。 INTEGER PRIMARY KEY將爲您提供一個唯一的正常遞增1個唯一標識符,但沒有AUTOINCREMENT的開銷,這可確保更高的數量,但需要付出代價。