Android. Exception di SQLite: nessuna colonna _id

Im avendo alcuni problemi cercando di get le informazioni memorizzate nel mio database e visualizzarla in un ListView.

Questa è la ListActivity where voglio mostrare le righe:

  • SQLiteOpenHelper non riesce a call onCreate?
  • Come dividere il valore separato da virgole in SQLite?
  • Utilizzando il model di disegno Singleton per SQLiteDatabase
  • Database che non copia dagli asset
  • DB SQLite accessibile da più thread
  • Query where si trova e where
  • 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_listdb, result, columns, to); this.setListAdapter(mAdapter); } 

    La class DB. Ecco il metodo getAllContact where ottengo l'errore:

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

    }

    Ecco i messaggi di errore del 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 

    Quindi, qualcuno può aiutare a farlo? Grazie in anticipo !

    5 Solutions collect form web for “Android. Exception di SQLite: nessuna colonna _id”

    Probabilmente non hai una colonna _id nella tabella del database. Estrarre il database e aprirlo con SqliteViewer per verificare se esista effettivamente. Il database è di solito sotto /data/data/com.yourapp.package/databases/

    È ansible utilizzare: http://sqlitebrowser.sourceforge.net/ o http://www.navicat.com/en/products/navicat_sqlite/sqlite_overview.html (dispongono inoltre di una versione gratuita di lite)

    Se si è creato un database ad esempio con i campi 'a', 'b' e 'c' e si utilizza questo db, se si aggiunge un nuovo field (ad esempio 'd') è necessario ricreare il database sul telefono (basta cancellarlo).

    Prova a rowid invece di _id . Per me funziona.

    Giusto, dovresti creare la tabella del database prima di interrogarla.

    Ecco un esempio:

      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" + ");"; 

    Quindi ricercare qui:

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

    Sembra inoltre che manca un sesto argomento per quello che stai cercando. Vedi where ho inserito "" nella string dei parametri di metodo.

    Questo è ansible esiste 2 possiblities:

    1. Questo problema può verificarsi da schemi SQLite rotto.

    La tua domanda non riguarda il problema di SQL Statement. ma molti sviluppatori possono pensare al problema di SQL Statement sulla tua domanda.

    Questo caso non può verificare dati danneggiati nel file di database. Anche se non è ansible utilizzare campi selezionati e sql where la clausola per nome di field.

    Di conseguenza, non è ansible utilizzare il file di database nel proprio codice android.

    Esattamente la soluzione, raccommand di ricreare il file DB SQLite, passo dopo passo.

    Devi eseguire il backup prima di utilizzare lo strumento di modifica SQLite. (SQLite Manager, Browser, altri strumenti di gestione db)

    1. Questo problema si è verificato dai tuoi dati persistenti.

    Se si utilizza lo stesso nome di file per le attività oi dati grezzi quando vengono eseguiti con i dati modificati,

    puoi provare a disinstallare l'applicazione installata precedente per aggiornarlo.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.