Android SqLite没有这样的列_id异常

时间:2012-07-16 16:57:38

标签: android sqlite

不要立即标记我的重复问题。我的问题不同,因为我的SQL查询格式正确。

public static final String TABLE_NAME = "log";
public static final String COLUMN_ID = "_id";
public static final String LOG_TEXT = "logtext";
private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " (" +
        COLUMN_ID + " integer primary key autoincrement, " +
        LOG_TEXT + " TEXT not null);";

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(TABLE_CREATE);

}

我在这里查询

String[] columns = {LOG_TEXT,COLUMN_ID};
    Cursor cursor = helper.getReadableDatabase().query(TABLE_NAME, columns, null, null, null, null, COLUMN_ID + " desc");

我发现这个包含sql查询的异常。

catch(Exception e){
Log.D("sql Exception",e.getMessage());}

然后返回

no such column: _id: , while compiling: SELECT logtext, _id FROM log ORDER BY _id desc

我一般都熟悉Oracle SQL和关系数据库。这是我的ORDER BY子句吗?我确信你总是可以使用订单。它与GROUP BY没有相同的行为。

关于为什么例外的任何想法? 如果有人想看到我正在使用我的ArrayAdaptor语句进行更新。我在listview中使用光标

String[] data = query();


    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, android.R.id.text1, data);
    listView.setAdapter(adapter);}

3 个答案:

答案 0 :(得分:4)

<强>重写

每当您更改TABLE_CREATE中的架构时,您必须通知应用这些更改,当您更改TABLE_CREATE时,这些更改不会自动发生。最简单的方法是在扩展的SQLiteOpenHelper类中增加database_version。您发现您也可以卸载/重新安装该应用程序,以获得相同的结果。如果你精通SQL,你可以改变表格。但无论采用哪种方法,您都必须确保应用程序在尝试访问新列之前更改架构...

同样适用于SQLite:

_id integer primary key

synonymous,其中包含:

_id integer primary key autoincrement not null

查询使用降序作为默认顺序,因此ORDER BY _idORDER BY _id DESC相同。

答案 1 :(得分:2)

有同样的问题,意味着它应该有效但没有(在我修复的create命令中有一些拼写错误,但仍然没有帮助)。然后一位同事告诉我尝试清除数据(只是在AppInfo然后&#34;清除数据&#34;)这解决了我的问题,显然旧的数据库(没有工作)仍然在那里,不得不先被清除。

我只是把这个答案放在这里以防万一其他人喜欢我(android初学者)偶然遇到这个问题,因为我经历了几十个stackoverflow线程有这个问题,但没有人提供这种可能性/解决方案而且它让我困扰了一些时间。

答案 2 :(得分:0)

您是否稍后在创建语句中添加了_id列的定义,即在代码已经运行一次之后?数据库是持久化文件,因此如果您修改代码中的表结构,则需要确保清除应用程序的数据,以便使用正确的表/列数据重新创建数据库文件。