Android sqlite3说“没有_id”,但表肯定有

时间:2011-09-01 14:55:57

标签: android sqlite

不知何故,在调试一个基于位置的Android应用程序时,我得到一个奇怪的异常。看看并分享您的想法:

我已通过ListActivityContentProvider与sqlite3数据库相关联。现在,当我开始ListActivity程序时,程序会以异常告诉我

column '_id' does not exist

(没有表格名称)代表我为SimpleCursorAdapter创建ListActivity对象的行。

    Cursor cursor = managedQuery(intent.getData(), new String[] {TrackTable.START_LOC, TrackTable.END_LOC}, null, null,
            TrackTable.DEFAULT_SORT_ORDER);
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.gps_track_entry, cursor, new String[] {
                    TrackTable.COLUMN_NAME_TIME_START,
                    TrackTable.COLUMN_NAME_TIME_END
                }, new int[] { R.id.l_start, R.id.l_end });

我的数据库看起来像这样:

sqlite> .tables
.tables
android_metadata ocation track
sqlite> . schema track
.schema track
CREATE TABLE track (
  _id INTEGER PRIMARY KEY,
  start_location INTEGER,
  end_location INTEGER,
  start_time TEXT,
  end_time TEXT
);
sqlite> .schema location
.schema location
CREATE TABLE location (
  _id INTEGER PRIMARY KEY,
  long TEXT,
  lat TEXT,
  alt TEXT,
  accu TEXT,
  bear TEXT,
  sped TEXT,
  time TEXT);
sqlite> .schema android_metadata
.schema android_metadata
CREATE TABLE android_metadata (locale TEXT);

我的意思是,这个错误不太可能是一个Android错误,但它肯定看起来像一个,因为唯一没有_id的表是android_metadata。但也许我以一种奇怪的方式写了一些东西,VM现在认为我想使用android_metadata而不是track,我实际上想要使用它。

1 个答案:

答案 0 :(得分:4)

Erich就在上方;问题是您的SELECT查询需要包含BaseColumns._ID作为投影的一部分。类似的东西:

Cursor cursor = getContentResolver().query(TrackTable.CONTENT_URI, 
        new String[] { TrackTable._ID, TrackTable.COLUMN_NAME_TIME_START,
        TrackTable.COLUMN_NAME_TIME_END }, null, null, null);

BTW,请参阅CursorAdapter的javadoc:

  

Cursor必须包含名为“_id”的列,否则此类将无效。