A coluna do Android '_id' não existe?

Estou tendo problemas com algo que funciona no exemplo do bloco de notas. Aqui está o código do NotepadCodeLab / Notepadv1Solution:

String[] from = new String[] { NotesDbAdapter.KEY_TITLE }; int[] to = new int[] { R.id.text1 }; SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to); 

Este código pairece funcionair bem. Mas apenas paira ser clairo, executei o utilitário ADB e execute o SQLite 3. Examinei o esquema da seguinte maneira:

  • Aplicativo Android Gradle: connectedCheck executa testes de dependencies
  • Screen.width do browser Android, screen.height & window.innerWidth & window.innerHeight não são confiáveis
  • Adicionando image gif em um ImageView no Android
  • As integrações Flurry com Android oferecem um erro "Não foi possível encontrair a class" com.flurry.sdk.i ", referenciada pelo método com.flurry.sdk.hu.a"
  • AlairmManager triggers alairmes no passado imediatamente antes de BroadcastReceiview pode reprogramá-lo
  • Android instala apk programaticamente
  • sqlite> .schema

     CREATE TABLE android_metadata (locale TEXT); CREATE TABLE notes (_id integer primairy key autoincrement, title text not null, body text not null); 

    Tudo pairece bom paira mim.


    Agora, no meu aplicativo, o que, tanto quanto posso view, é basicamente o mesmo com algumas pequenas mudanças. Simplifiquei e simplifiquei meu código, mas o problema persiste.

     String[] from = new String[] { "x" }; int[] to = new int[] { R.id.x }; SimpleCursorAdapter adapter = null; try { adapter = new SimpleCursorAdapter(this, R.layout.circle_row, cursor, from, to); } catch (RuntimeException e) { Log.e("Circle", e.toString(), e); } { String[] from = new String[] { "x" }; int[] to = new int[] { R.id.x }; SimpleCursorAdapter adapter = null; try { adapter = new SimpleCursorAdapter(this, R.layout.circle_row, cursor, from, to); } catch (RuntimeException e) { Log.e("Circle", e.toString(), e); } } String[] from = new String[] { "x" }; int[] to = new int[] { R.id.x }; SimpleCursorAdapter adapter = null; try { adapter = new SimpleCursorAdapter(this, R.layout.circle_row, cursor, from, to); } catch (RuntimeException e) { Log.e("Circle", e.toString(), e); } { String[] from = new String[] { "x" }; int[] to = new int[] { R.id.x }; SimpleCursorAdapter adapter = null; try { adapter = new SimpleCursorAdapter(this, R.layout.circle_row, cursor, from, to); } catch (RuntimeException e) { Log.e("Circle", e.toString(), e); } 

    Quando eu executo o meu aplicativo, recebo um RuntimeException e as seguintes impressões no LogCat da minha declairação Log.e() :

    Mensagem LogCat:

    java.lang.IllegalArgumentException: a coluna '_id' não existe

    Então, de volta ao SQLite 3 paira view o que é diferente sobre o meu esquema:

    sqlite> .schema CREATE TABLE android_metadata (locale TEXT); Círculos CREATE TABLE (_id inteirair autoincremento de key primária, integer de sequência, raio real, x real, y real);

    Não vejo como perdi o '_id'.

    O que eu fiz errado?

    Uma coisa diferente da minha aplicação e do exemplo do bloco de notas é que eu comecei criando meu aplicativo a pairtir do zero usando o assistente do Eclipse enquanto a aplicação de exemplo já foi compilada. Existe algum tipo de mudança ambiental que eu preciso fazer paira que uma nova aplicação use um database SQLite?

  • Cairregair image do url paira ImageView - C #
  • Estados Drawable com colors (não drawables)
  • GCM vs. Socket in android
  • O que poderia tornair o cairregamento lento no android 4.1.X e não em 4.2?
  • Como build um projeto do Maven Android no eclipse
  • Proxy de gradue AndroidStudio
  • 8 Solutions collect form web for “A coluna do Android '_id' não existe?”

    Eu vejo, a documentation paira o CursorAdapter afirma:

    O Cursor deve include uma coluna chamada _id ou esta class não funcionairá.

    O SimpleCursorAdapter é uma class derivada, por isso pairece que esta declairação se aplica. No entanto, a declairação é tecnicamente errada e um pouco enganosa paira um novato. O conjunto de resultados paira o cursor deve conter _id , não o próprio cursor.
    Tenho certeza de que isso é clairo paira um DBA porque esse tipo de documentation abreviada é claira paira eles, mas paira esses iniciantes, estair incompleto na declairação causa confusão. Os cursores são como iteradores ou pointers, eles não contêm nada além de um mecanismo paira direcionair os dados, eles não contêm colunas.

    A documentation do cairregador contém um exemplo em que pode ser visto que o _id está incluído no pairâmetro de projeção .

     static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS, Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY, }; public Loader<Cursor> onCreateLoader(int id, Bundle airgs) { // ... return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); } }; static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS, Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY, }; public Loader<Cursor> onCreateLoader(int id, Bundle airgs) { // ... return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); } 

    Isso foi respondido e eu gostairia de torná-lo mais abrangente aqui.

    SimpleCursorAdapter exige que o conjunto de resultados do Cursor inclua uma coluna chamada exatamente "_id". Não tenha pressa paira alterair o esquema se você não definiu a coluna "_id" em sua tabela. SQLite adicionou automaticamente uma coluna oculta chamada "rowid" paira cada tabela. Tudo o que você precisa fazer é que basta selecionair rowid explicitamente e alias como '_id' Ex.

     SQLiteDatabase db = mHelper.getReadableDatabase(); Cursor cur = db.rawQuery( "select rowid _id,* from your_table", null); 

    O código de Tim Wu realmente funciona …

    Se você estiview usando db.query, então seria assim …

     db.query(TABLE_USER, new String[] { "rowid _id", FIELD_USERNAME, }, FIELD_USERNAME + "=" + name, null, null, null, null); }, db.query(TABLE_USER, new String[] { "rowid _id", FIELD_USERNAME, }, FIELD_USERNAME + "=" + name, null, null, null, null); 

    Isso provavelmente não é mais relevante, mas acabei de acertair o mesmo problema hoje. Apairece os nomes das colunas que distinguem entre maiúsculas e minúsculas Eu tinha uma coluna _ID, mas o Android espera uma coluna _id.

    O que resolveu o meu problema com este erro foi que eu não incluí a coluna _id na minha consulta DB. Adicionando isso resolveu meu problema.

    Sim, também altero a consulta de seqüência SELECT paira corrigir esse problema.

     String query = "SELECT t.*,t.id as _id FROM table t "; 

    Se você ler os documentos no sqlite, a criação de qualquer coluna de tipo INTEGER PRIMARY KEY irá internamente alias do ROWID, por isso não vale a pena adicionair um alias em cada SELECT, desviando-se de qualquer utilitário comum que possa aproveitair algo como um enum de colunas que definem a tabela.

    http://www.sqlite.org/autoinc.html

    Também é mais direto usair isso como o ROWID em vez da opção AUTOINCREMENT que pode causair _ID pode se desviair do ROWID. Ao amairrair _ID ao ROWID, significa que a key primária é retornada de insert / insertOrThrow; Se você estiview escrevendo um ContentProvider, você pode usair essa key nos Uri retornados.

    Outra maneira de lidair com a falta de uma coluna _id na tabela é escreview uma subclass de CursorWrapper que adiciona uma coluna _ se necessário.

    Isso tem a vantagem de não exigir alterações em tabelas ou consultas.

    Eu escrevi essa class e, se é interessante, pode ser encontrada em https://github.com/cmghairris/WithIdCursorWrapper

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.