1

不要立即标记我重复的问题。我的问题不同,因为我有一个格式正确的 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 子句吗?我确信你总是可以使用 order by。它与 GROUP BY 的行为不同。

关于为什么例外的任何想法?万一有人想看到我正在使用我的 ArrayAdaptor 语句进行更新。我在列表视图中使用光标

String[] data = query();


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

3 回答 3

5

改写

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

也适用于 SQLite:

_id integer primary key

同义词

_id integer primary key autoincrement not null

并且查询使用降序作为默认顺序,因此ORDER BY _idORDER BY _id DESC.

于 2012-07-16T17:02:06.323 回答
2

有同样的问题,这意味着它应该可以工作但没有(我修复的 create 命令中有一些拼写错误,但仍然没有帮助)。然后一位同事告诉我尝试清除数据(仅在 AppInfo 然后“清除数据”)解决了我的问题,显然旧数据库(不起作用)仍然存在,必须先清除。

我只是把这个答案放在这里,以防像我这样的其他人(android初学者)偶然发现这个问题,因为我经历了几十个stackoverflow线程来解决这个问题,但没有一个提供这种可能性/解决方案,它困扰了我很长一段时间。

于 2014-12-26T21:27:03.120 回答
1

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

于 2012-07-16T17:10:51.220 回答