2017-10-15 31 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的开销,这可确保更高的数量,但需要付出代价。