Ошибка Android при реализации CursorAdapter — столбец _id

Недавно я использую sqlite в Android, и у меня проблема не решена.

Я нашел учебник, в котором объясняется, как запускать базу данных, и он отлично работает. Я счастлив, что нашел. Теперь я хочу реализовать CursorAdapter для настройки списка, содержащего данные БД... но я всегда сталкиваюсь с одной и той же ошибкой. Я много читал об этом и я встречал людей (на этом сайте) происходит то же самое, но не могу понять ответ. У меня пару дней с этой проблемой.

Сначала покажите код, это моя основная деятельность:

public class RegistrosActivity extends Activity {

    private ListView listView;
    private Adapter_bd_notificaciones customAdapter;
    private SQLite sqlite;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registros);
        //
        listView = (ListView) findViewById(R.id.lstRegistros);
        //Open conexion sqlite
        sqlite = new SQLite(this);
        sqlite.abrir();

        Cursor cursor = sqlite.getRegistros();
        customAdapter = new Adapter_bd_notificaciones(RegistrosActivity.this, cursor);
        listView.setAdapter(customAdapter);

    }
// the rest of the code

}

SQLite.java

public class SQLite {

    private SQLiteHelper sqliteHelper;
    private SQLiteDatabase db;  

    public SQLite(Context context)
    {
        sqliteHelper = new SQLiteHelper( context );
    }

    public void abrir(){
        Log.i("SQLite", "Se abre conexion a la base de datos " + sqliteHelper.getDatabaseName() );
        db = sqliteHelper.getWritableDatabase();        
    }

    public void cerrar()
    {
        Log.i("SQLite", "Se cierra conexion a la base de datos " + sqliteHelper.getDatabaseName() );
        sqliteHelper.close();       
    }


    public boolean addRegistro( String nombre, String fecha, String pais, String sexo, String ingles )
    {       
        if( nombre.length()> 0 )
        {
            ContentValues contentValues = new ContentValues();
            contentValues.put( sqliteHelper.__campo_nombre , nombre);
            contentValues.put( sqliteHelper.__campo_fechanac , fecha  );
            contentValues.put( sqliteHelper.__campo_pais , pais);
            contentValues.put( sqliteHelper.__campo_sexo , sexo);
            contentValues.put( sqliteHelper.__campo_ingles , ingles);
            Log.i("SQLite", "Nuevo registro " );
            return ( db.insert( sqliteHelper.__tabla__ , null, contentValues ) != -1 )?true:false;          
        }
        else
            return false; 
    }

    public int getUltimoID()
    {
        int id = -1;

        Cursor cursor = db.query( sqliteHelper.__tabla__ , 
                new String[]{ sqliteHelper.__campo_id },
                null, null, null,null,
                sqliteHelper.__campo_id + " DESC ", "1");
        if( cursor.moveToFirst() )
        {
            do
            {
                id = cursor.getInt(0);
            } while ( cursor.moveToNext() );
        }
        return id;
    }


    public boolean borrar_registro( int id )
    {
        return  (db.delete( sqliteHelper.__tabla__ , sqliteHelper.__campo_id + " = " + id ,  null) > 0) ? true:false;
    }

    public Cursor getRegistros()
    {
        return db.query( sqliteHelper.__tabla__ ,               
                    new String[]{
                            sqliteHelper.__campo_id ,
                            sqliteHelper.__campo_nombre,
                            sqliteHelper.__campo_fechanac,
                            sqliteHelper.__campo_pais,
                            sqliteHelper.__campo_sexo,
                            sqliteHelper.__campo_ingles
                                  }, 
                null, null, null, null, null);
    }

    public Cursor getRegistro( int id )
    {
        return db.query( sqliteHelper.__tabla__ ,               
                    new String[]{
                            sqliteHelper.__campo_id ,
                            sqliteHelper.__campo_nombre,
                            sqliteHelper.__campo_fechanac,
                            sqliteHelper.__campo_pais,
                            sqliteHelper.__campo_sexo,
                            sqliteHelper.__campo_ingles
                                  }, 
                sqliteHelper.__campo_id + " = " + id , 
                null, null, null, null);
    }

    public ArrayList<String> getFormatListUniv( Cursor cursor )
    {
        ArrayList<String> listData = new ArrayList<String>();
        String item = "";
            if( cursor.moveToFirst() )
            {
                do
                {
                    item += "ID: [" + cursor.getInt(0) + "]\r\n";
                    item += "Nombre: " + cursor.getString(1) + "\r\n";
                    item += "Fecha de Nacimiento: " + cursor.getString(2) + "\r\n";
                    item += "Pais: " + cursor.getString(3) + "\r\n";
                    item += "Sexo: " + cursor.getString(4) + "\r\n";
                    item += "Habla ingles: " + cursor.getString(5) + "";
                    listData.add( item );
                    item="";

                } while ( cursor.moveToNext() );
            }       
        return listData;        
    }

}

SQLiteHelper.java

public class SQLiteHelper extends SQLiteOpenHelper {


    private static final String __DATABASE = "dbUniversidad";

    private static final int __VERSION = 3;

    public final String __tabla__ = "Universitario";
    public final String __campo_id = "id";
    public final String __campo_nombre = "Nombre";
    public final String __campo_fechanac = "FechaNac";
    public final String __campo_pais = "Pais";
    public final String __campo_sexo = "Sexo";
    public final String __campo_ingles = "Ingles";

    private final String sql = "CREATE TABLE " + __tabla__ + " ( " +
                   __campo_id + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + 
                   __campo_nombre + " TEXT NULL, " + __campo_fechanac + " TEXT, " + __campo_pais + " TEXT NULL, " +
                   __campo_sexo + " TEXT NULL, " + __campo_ingles + " TEXT NULL " +
                        " )";

    public SQLiteHelper(Context context) {      
        super( context, __DATABASE, null, __VERSION );      
    }

    @Override
    public void onCreate(SQLiteDatabase db) {       
         db.execSQL( sql );      
    }

    @Override
    public void onUpgrade( SQLiteDatabase db,  int oldVersion, int newVersion ) {       
        if ( newVersion > oldVersion )
        {
            //elimina tabla
            db.execSQL( "DROP TABLE IF EXISTS " + __tabla__ );
            //y luego creamos la nueva tabla
            db.execSQL( sql );
        }
    }
}

И, как я уже сказал, после двух дней множества вариаций и изменений, много читал об этом, я всегда нахожу одну и ту же ошибку:

java.lang.RuntimeException: Unable to start activity ComponentInfo{my.database.example/my.database.example.RegistrosActivity}: java.lang.IllegalArgumentException: column '_id' does not exist

Я знаю, что у большинства людей было то же самое, но даже читая правильные ответы, я не знаю, как применить свой код.

столбец '_id' не существует

Подскажите, пожалуйста, как заставить корректно работать CursorAdapter в моем коде? какую строку я пропустил? Что я делаю не так? Я был бы признателен, если бы вы могли исправить мой код.

Огромное спасибо за помощь.

Привет!

PS. Как будто это было полезно, это полная ошибка:

FATAL EXCEPTION: main
Process: my.database.example, PID: 31765
java.lang.RuntimeException: Unable to start activity ComponentInfo{my.database.example/my.database.example.RegistrosActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
at android.widget.CursorAdapter.init(CursorAdapter.java:172)
at android.widget.CursorAdapter.<init>(CursorAdapter.java:120)
at my.database.example.Adapter_bd_notificaciones.<init>(Adapter_bd_notificaciones.java:15)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)

person Sergio76    schedule 16.06.2015    source источник
comment
Измените public final String __campo_id = "id"; на public final String __campo_id = "_id";. Вам нужно будет полностью удалить приложение   -  person Blackbelt    schedule 16.06.2015
comment
нет необходимости в удалении, когда вы можете использовать: выберите что-то как _id, где...   -  person pskink    schedule 16.06.2015
comment
Спасибо большое друг!   -  person Sergio76    schedule 16.06.2015


Ответы (1)


Как упомянул Блэкбелт в своем комментарии, Android ожидает, что столбец основного идентификатора будет называться «_id».

person Christian    schedule 16.06.2015