不知何故,在调试一个基于位置的 Android 应用程序时,我遇到了一个奇怪的异常。看看并分享您的想法:
我已通过 ContentProvider
将 ListActivity
连接到 sqlite3 数据库。现在,当我启动 ListActivity
时,程序总是会终止并出现异常告诉我
column '_id' does not exist
(没有表名)为我为 ListActivity
创建 SimpleCursorAdapter
对象的行。
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
。但也许我以一种奇怪的方式写了一些东西,虚拟机现在认为我想使用 android_metadata
而不是 track
,而我实际上想使用它。
最佳答案
埃里希就在上面;问题是您的 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);
顺便说一句,请参阅 CursorAdapter 的 javadoc :
The Cursor must include a column named "_id" or this class will not work.
关于Android sqlite3 说 "no _id"但表肯定有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7272176/