android:java.lang.illegalargumentexception列'details'不存在

时间:2011-10-10 07:28:48

标签: java android sqlite

我看到了很多关于_id问题的问题。但我的问题是在数据库创建查询中定义的其他列...

public class DatabaseHelper extends SQLiteOpenHelper{

    static final String dbName="Shadows";
    static final String pages="pages";
    static final String pages_id="_id";
    static final String date="date";
    static final String details="details";

    public DatabaseHelper(Context context) {
        super(context, dbName, null, 33);
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS pages (_id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT, details TEXT);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+pages);
        onCreate(db);
    } 


    public Cursor getallPages(){
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor c=db.rawQuery("SELECT * FROM PAGES", new String[] {});
        return c;
    }
}

现在在调用此getPages()函数后使用了简单的游标适配器。

String[] from = new String[]{
    DatabaseHelper.pages_id,
    DatabaseHelper.date,
    DatabaseHelper.details
};
int[] to = new int[]{R.id.id,R.id.name,R.id.mail};
SimpleCursorAdapter sca = new SimpleCursorAdapter(
    this,R.layout.gridview,c,from,to
);

它出现错误“列详细信息不存在”。谢谢提前

1 个答案:

答案 0 :(得分:0)

两件事。

您应该在SQL构造函数中使用最终的静态字段详细信息 - 这样可以避免任何轻微的错误。

db.execSQL("CREATE TABLE IF NOT EXISTS "+pages+" ("+pages_id+" INTEGER PRIMARY KEY AUTOINCREMENT, "+date+" TEXT, "+details+" TEXT);");

从选择

 Cursor c=db.rawQuery("SELECT * FROM "+pages, new String[] {});

这是一种很好的做法,也意味着如果您决定更改某些内容,那么它会自动处理。

但最可能的原因是数据库(和表)已经存在但格式不同 - 如果您最近更改了代码以添加或重命名详细信息列,则此代码不会丢失并重新创建桌子。

最简单的测试 - 只需从设备中清除此应用程序的数据,然后再次运行它 - 看起来你一直在增加数据库版本来做同样的事情,所以你确定你做到了吗?

除了错误的预先存在的数据库之外,这看起来应该可行。