不知何故,在调试一个基于位置的Android应用程序时,我得到一个奇怪的异常。看看并分享您的想法:
我已通过ListActivity
将ContentProvider
与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
,我实际上想要使用它。
答案 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”的列,否则此类将无效。