Android系统。 SQLite异常:没有这样的列_id

时间:2010-10-12 01:43:55

标签: android sqlite listactivity

我有一些麻烦试图将信息存储在我的数据库中并在ListView中显示。

这是我想要显示行的ListActivity:

public class Prueba extends ListActivity{

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.i_prueba);

        DataBaseAccess db = new DataBaseAccess(this);
        db.open();

        Cursor result = db.getAllContact();
        startManagingCursor(result);


        // the desired columns to be bound
        String[] columns = new String[] {"_id", "nombre", "telefono", "mail"};
        // the XML defined views which the data will be bound to
        int[] to = new int[] { R.id.textid, R.id.textNombre, R.id.textTelefono, R.id.textMail };

        SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.i_listadb, result, columns, to);


        this.setListAdapter(mAdapter);

    }

数据库类。这是方法getAllContact,我得到错误:

公共类DataBaseAccess {

public static final String NOMBRE = "nombre";
public static final String TELEFONO = "telefono";
public static final String MAIL = "mail";
public static final String ID = "_id";


    public DataBaseAccess(Context context) {
        this.androidContext = context;
//DataBaseHelper is another class where the Database is created. In the "onCreate" //method of that class is where i make the CREATE TABLE and add some values to that //table.
        dbHelper = new DataBaseHelper(androidContext);  
    }



    public void open() throws SQLException {
        db = dbHelper.getWritableDatabase();
        }



[...MORE METHODS...]

    public Cursor getAllContact(){
        String[] columnas = new String[] {ID, NOMBRE, TELEFONO, MAIL};
        Cursor mCursor = dbHelper.query("t_contactos", columnas, null, null, null, null, null);
    if (mCursor != null){
        mCursor.moveToFirst();
    }
    return mCursor;
}

}

以下是来自LogCat的错误消息:

E/AndroidRuntime(  636): Uncaught handler: thread main exiting due to uncaught exception

E/AndroidRuntime(  636): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pfc.android/com.pfc.android.Prueba}: android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, nombre, telefono, mail FROM t_contactos

E/AndroidRuntime(  636):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)

E/AndroidRuntime(  636):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)

E/AndroidRuntime(  636):    at android.app.ActivityThread.access$2100(ActivityThread.java:116)

E/AndroidRuntime(  636):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)

E/AndroidRuntime(  636):    at android.os.Handler.dispatchMessage(Handler.java:99)

E/AndroidRuntime(  636):    at android.os.Looper.loop(Looper.java:123)

E/AndroidRuntime(  636):    at android.app.ActivityThread.main(ActivityThread.java:4203)

E/AndroidRuntime(  636):    at java.lang.reflect.Method.invokeNative(Native Method)

E/AndroidRuntime(  636):    at java.lang.reflect.Method.invoke(Method.java:521)

E/AndroidRuntime(  636):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)

E/AndroidRuntime(  636):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)

E/AndroidRuntime(  636):    at dalvik.system.NativeStart.main(Native Method)

E/AndroidRuntime(  636): Caused by: android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, nombre, telefono, mail FROM t_contactos

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteProgram.native_compile(Native Method)

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118)

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1006)

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:964)

E/AndroidRuntime(  636):    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1041)

E/AndroidRuntime(  636):    at com.pfc.android.DataBaseAccess.getAllContact(DataBaseAccess.java:97)

E/AndroidRuntime(  636):    at com.pfc.android.Prueba.onCreate(Prueba.java:21)

E/AndroidRuntime(  636):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)

E/AndroidRuntime(  636):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)

E/AndroidRuntime(  636):    ... 11 more

那么,任何人都可以帮忙解决这个问题吗? 提前谢谢!

6 个答案:

答案 0 :(得分:6)

您的数据库表中可能没有列_id。拉出数据库并使用SqliteViewer打开它以检查它是否确实存在。该数据库通常位于/data/data/com.yourapp.package/databases /

您可以使用: http://sqlitebrowser.sourceforge.net/ 要么 http://www.navicat.com/en/products/navicat_sqlite/sqlite_overview.html(他们也有免费的精简版)

答案 1 :(得分:4)

如果您创建了数据库,例如字段'a','b'和'c'并使用了此db,那么如果添加新字段(例如'd'),则需要在手机上重新创建数据库(只需删除它)。

答案 2 :(得分:3)

尝试使用rowid代替_id。它对我有用。

答案 3 :(得分:1)

是的,你应该在查询之前创建数据库表。

以下是一个例子:

 private static final String DATABASE_CREATE_DRIVERS =
        "create table " + DATABASE_TABLE_DRIVERS + "(" + KEY_ROWID +" integer primary key autoincrement, "
        + KEY_DRIVERID + " text not null,"
        + KEY_FIRST_NAME + " text not null,"
        + KEY_LAST_NAME + " text not null,"
        + KEY_SPEED_LIMIT + " int not null,"
        + KEY_TIMESTAMP + " int"
        + ");";

然后在这里查询:

 public Cursor fetchAllDrivers(){
     Cursor mCursor =
         mDb.query(true, DATABASE_TABLE_DRIVERS, new String[] {
                 KEY_ROWID, 
                 KEY_DRIVERID,
                 KEY_FIRST_NAME,
                 KEY_LAST_NAME,
                 KEY_SPEED_LIMIT,
                 KEY_TIMESTAMP},"", null,null, null, null, null);
     if (mCursor != null) {
         mCursor.moveToFirst();
     }
     return mCursor;
 }

您似乎还缺少关于您要查询的内容的第六个参数。查看我在方法参数字符串中放置“”的位置。

答案 4 :(得分:0)

这可能存在2种可能性:

  1. SQLite架构损坏可能会导致此问题。
  2. 您的问题与SQL语句问题无关。但是很多开发人员可以认为SQL Statement有关你问题的问题。

    此案例可以检查数据库文件中没有损坏的数据。虽然您不能使用select字段和sql where子句字段名称。

    因此,您无法在Android代码中使用数据库文件。

    完全解决方案,我建议一步一步地重新创建SQLite DB文件。

    在使用SQLite修改工具之前必须备份。 (SQLite Manager,浏览器,其他数据库管理工具)

    1. 您的持久数据发生此问题。
    2. 如果在使用修改后的数据运行时对资产或原始数据使用相同的文件名,

      您可以尝试卸载以前安装的应用以进行刷新。

答案 5 :(得分:-2)

我更改我的数据库名称,全部为lower_caps。它对我有用。