Android 列'_id';使用简单适配器时不存在
我正在尝试创建一个简单的联系人列表应用程序。当我想创建一个新联系人并输入联系人的字段并按下保存按钮时,我遇到一个错误“非法例外列id不存在” 我使用简单的游标适配器来显示从数据库到列表小部件的数据 以下是我的源代码:Android 列'_id';使用简单适配器时不存在,android,sqlite,exception,illegalargumentexception,Android,Sqlite,Exception,Illegalargumentexception,我正在尝试创建一个简单的联系人列表应用程序。当我想创建一个新联系人并输入联系人的字段并按下保存按钮时,我遇到一个错误“非法例外列id不存在” 我使用简单的游标适配器来显示从数据库到列表小部件的数据 以下是我的源代码: public class WebpreneurActivity extends ListActivity { private static final int CONTACT_CREATE = 0; private static final int CON
public class WebpreneurActivity extends ListActivity {
private static final int CONTACT_CREATE = 0;
private static final int CONTACT_EDIT = 1;
//select the second one, Android view menu
private static final int INSERT_ID = Menu.FIRST;
private static final int DELETE_ID = Menu.FIRST + 1;
private DBHandler dbHelper;
private Cursor c;
ImageButton imageButton;
long rowid;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d("database1" ,"0");
Log.d("Your Location4", "ok4:");
super.onCreate(savedInstanceState);
Log.d("database1" ,"1");
setContentView(R.layout.activity_webpreneur);
Log.d("database1" ,"2");
dbHelper = new DBHandler(this);
Log.d("database1" ,"3");
dbHelper.open();
//addListenerOnButton();
//dbHelper.addContact();
imageButton = (ImageButton) findViewById(R.id.imageButton1);
Log.d("database1" ,"button");
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Log.d("database1" ,"b4");
Intent i = new Intent(getApplicationContext(), ContactEdit.class);
startActivityForResult(i, CONTACT_CREATE);
Log.d("database1" ,"button3");
//fillData();
}
});
//dbHelper.close();
}
@SuppressWarnings("deprecation")
public void fillData() {
Log.d("Your Location4", "ok6:");
c = dbHelper.fetchAllRows();
Log.d("Your Location4", "ok8:");
startManagingCursor(c);
Log.d("Your Location4", "ok2:");
// point of error !!!!
////// ListAdapter adapter = new SimpleCursorAdapter(this,
R.layout.contact_row, c, new String[] { DBHandler.Key_Name,
DBHandler.Key_Phone }, new int[] { R.id.name,
R.id.phonenumber });
setListAdapter(adapter);
}
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, ContactEdit.class);
i.putExtra(DBHandler.Key_ID, c.getLong(c.getColumnIndex(DBHandler.Key_ID)));
i.putExtra(DBHandler.Key_Name, c.getString(c.getColumnIndex(DBHandler.Key_Name)));
i.putExtra(DBHandler.Key_Address, c.getString(c.getColumnIndex(DBHandler.Key_Address)));
i.putExtra(DBHandler.Key_Phone, c.getString(c.getColumnIndex(DBHandler.Key_Phone)));
i.putExtra(DBHandler.Key_Website, c.getString(c.getColumnIndex(DBHandler.Key_Home)));
startActivityForResult(i, CONTACT_EDIT);
}
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
String name = data.getStringExtra(DBHandler.Key_Name);
String address = data.getStringExtra(DBHandler.Key_Address);
String mobile = data.getStringExtra(DBHandler.Key_Phone);
String home = data.getStringExtra(DBHandler.Key_Home);
switch (requestCode) {
case CONTACT_CREATE:
Log.d("Your Location4", "jj:");
dbHelper.createRow(name, address, mobile, home);
Log.d("Your Location4", "ok90:");
fillData();
break;
case CONTACT_EDIT:
String id = data.getStringExtra(DBHandler.Key_ID);
long rowId=Long.parseLong(id);
if (rowId != (Long)null){
dbHelper.updateRow(rowId, name, address, mobile, home);
}
fillData();
break;
}
}
}
}
这是我的原木猫
01-28 13:34:34.841: D/AndroidRuntime(24324): Shutting down VM
01-28 13:34:34.841: W/dalvikvm(24324): threadid=1: thread exiting with uncaught exception (group=0x4001d578)
01-28 13:34:34.871: E/AndroidRuntime(24324): FATAL EXCEPTION: main
01-28 13:34:34.871: E/AndroidRuntime(24324): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { (has extras) }} to activity {com.webpreneur_contactlist/com.webpreneur_contactlist.WebpreneurActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.app.ActivityThread.deliverResults(ActivityThread.java:2553)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2595)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.app.ActivityThread.access$2000(ActivityThread.java:121)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:973)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.os.Handler.dispatchMessage(Handler.java:99)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.os.Looper.loop(Looper.java:138)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.app.ActivityThread.main(ActivityThread.java:3701)
01-28 13:34:34.871: E/AndroidRuntime(24324): at java.lang.reflect.Method.invokeNative(Native Method)
01-28 13:34:34.871: E/AndroidRuntime(24324): at java.lang.reflect.Method.invoke(Method.java:507)
01-28 13:34:34.871: E/AndroidRuntime(24324): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
01-28 13:34:34.871: E/AndroidRuntime(24324): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
01-28 13:34:34.871: E/AndroidRuntime(24324): at dalvik.system.NativeStart.main(Native Method)
01-28 13:34:34.871: E/AndroidRuntime(24324): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.support.v4.widget.CursorAdapter.init(CursorAdapter.java:174)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.support.v4.widget.CursorAdapter.<init>(CursorAdapter.java:122)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.support.v4.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:54)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.support.v4.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:63)
01-28 13:34:34.871: E/AndroidRuntime(24324): at com.webpreneur_contactlist.WebpreneurActivity.fillData(WebpreneurActivity.java:82)
01-28 13:34:34.871: E/AndroidRuntime(24324): at com.webpreneur_contactlist.WebpreneurActivity.onActivityResult(WebpreneurActivity.java:117)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.app.Activity.dispatchActivityResult(Activity.java:3908)
01-28 13:34:34.871: E/AndroidRuntime(24324): at android.app.ActivityThread.deliverResults(ActivityThread.java:2549)
01-28 13:34:34.871: E/AndroidRuntime(24324): ... 11 more
光标适配器需要光标中的
\u id
字段才能工作
您可以使用以下CursorWrapper,它允许您将\u id
设置为所需的任何字段。
正如谷歌用户jc所说:
/**
* A {@link CursorWrapper} implementation that allows a {@link Cursor}
* without a field named "_id" to be used with various Android {@link ListView}
* classes that expect a column named "_id". This is done by specifying an
* alias field name to be used in place of "_id".
*
* @author j_...@users.sourceforge.net
*/
public class NoIdCursorWrapper extends CursorWrapper {
private int idColumnIndex;
/**
* Create a NoIdCursorWrapper using the alias column index.
* @param c the cursor to wrap
* @param idColumnIndex the column index to use as the _id column
alias
*/
public NoIdCursorWrapper(Cursor c, int idColumnIndex) {
super(c);
this.idColumnIndex = idColumnIndex;
}
/**
* Create a NoIdCursorWrapper using the alias column name.
* @param c the cursor to wrap
* @param idColumnName the column name to use as the _id column alias
*/
public NoIdCursorWrapper(Cursor c, String idColumnName) {
super(c);
idColumnIndex = c.getColumnIndex(idColumnName);
}
@Override
public int getColumnIndex(String columnName) {
int index = super.getColumnIndex(columnName);
if (index < 0 && "_id".equals(columnName)) {
index = idColumnIndex;
}
return index;
};
@Override
public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException {
int index = getColumnIndex(columnName);
if (index>=0) {
return index;
}
// let the AbstractCursor generate the exception
return super.getColumnIndexOrThrow(columnName);
};
即使不显示_id列,也必须在适配器中包含它
ListAdapter adapter = new SimpleCursorAdapter(this,
R.layout.contact_row, c, new String[] { "_id", DBHandler.Key_Name,
DBHandler.Key_Phone }, new int[] { R.id.name,
R.id.phonenumber });
您的
投影
有一个键ID
,它是“ID”
。所有这些都要求有一个名为“\u id”的列。您应该将id
列重命名为\u id
。作为一种快速解决方法,您还可以创建列别名:
public static final String PROJECTION[] = {
Key_ID + " AS _id",
确实有列id吗?我已使键id自动递增,否则就我而言,我没有任何列id,但请帮助我解决此问题,因为我很累。您是否对数据库结构进行了任何更改?如果已安装,则需要卸载该应用程序,然后将其重新安装到正在测试该应用程序的设备/模拟器中。如果表中有
\u id
列,只需将其添加到查询投影列中。我已经将其添加到该laaltocan中。请帮助解决此问题。现在我完全为空,无法解决此问题?您使用游标包装器而不是适配器中的游标。以正常方式读取光标,然后用光标作为参数创建NoIdCursorWrapper
,并将包装传递给适配器,而不是光标。将填充数据部分添加到应答wao wao您是专家先生,非常感谢,我没有话要说谢谢,非常欢迎。实际上,这个积分是从googlegroups中的游标(是的,不是在from
列中)分配给jc的。
ListAdapter adapter = new SimpleCursorAdapter(this,
R.layout.contact_row, c, new String[] { "_id", DBHandler.Key_Name,
DBHandler.Key_Phone }, new int[] { R.id.name,
R.id.phonenumber });
public static final String PROJECTION[] = {
Key_ID + " AS _id",