Android.Исключение SQLite: нет такого столбца _id - PullRequest
5 голосов
/ 12 октября 2010

У меня возникли проблемы при попытке получить информацию, хранящуюся в моей базе данных, и отобразить ее в 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

Так, кто-нибудь может помочь пройти через это? Заранее спасибо!

Ответы [ 5 ]

6 голосов
/ 12 октября 2010

Возможно, в вашей таблице базы данных нет столбца _id.Вытащите базу данных и откройте ее с помощью SqliteViewer, чтобы проверить, существует ли она на самом деле.База данных обычно находится в /data/data/com.yourapp.package/databases/

. Вы можете использовать: http://sqlitebrowser.sourceforge.net/ или http://www.navicat.com/en/products/navicat_sqlite/sqlite_overview.html (они также имеют бесплатную облегченную версию)

4 голосов
/ 13 июля 2011

Если вы создали базу данных, например, с полями «a», «b» и «c», и использовали эту базу данных, то, если вы добавите новое поле (например, «d»), вам необходимо восстановить базу данных на телефоне (просто удалите это).

3 голосов
/ 18 октября 2012

Попробуйте rowid вместо _id. У меня это работает.

1 голос
/ 27 июля 2011

Правильно, вы должны создать таблицу базы данных, прежде чем запрашивать ее.

Вот пример:

 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;
 }

Также кажется, что вы упускаете шестой аргумент относительно того, что вы запрашиваете. Посмотрите, куда я положил "" в строке параметра метода.

0 голосов
/ 12 августа 2016

Это может существовать 2 возможности:

  1. Эта проблема может возникать из-за неисправной схемы SQLite.

Ваш вопрос не о проблеме оператора SQL.но многие разработчики могут подумать о проблеме SQL Statement по вашему вопросу.

В этом случае можно проверить отсутствие поврежденных данных в файле базы данных.Хотя вы не можете использовать select fields и sql where по имени поля.

В результате вы не можете использовать файл базы данных в своем коде Android.

Точно решение, я рекомендую воссоздать БД SQLiteфайл, шаг за шагом.

Перед использованием инструмента модификации SQLite необходимо сделать резервную копию.(SQLite Manager, Browser, другие инструменты управления БД)

Эта проблема возникла из ваших постоянных данных.

Если вы используете одно и то же имя файла для ресурсов или необработанных данных при запуске с измененными данными,

вы можете попытаться удалить ранее установленныеприложение для обновления.

...