Cursor.getstring () está recibiendo el campo incorrecto en la base de datos

Así que este es mi código:

public void onItemClick(AdapterView<?> listView, View view, int position, long id) { Cursor cursor = (Cursor) listView.getItemAtPosition(position); int _id = cursor.getInt(0); String _recipe = cursor.getString(1); Intent intent = new Intent(Luzon1Activity.this,RecipeInstruction.class); intent.putExtra("id", _id); intent.putExtra("recipe", _recipe); startActivity(intent); } 

Este es mi código para la siguiente actividad:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.recipeinstruction); dbHelper = new Dbadapter(this); dbHelper.open(); bg = (RelativeLayout) findViewById(R.id.relativeLayout1); Bundle extras = getIntent().getExtras(); if (extras != null) { id = extras.getInt("id"); recipe = extras.getString("recipe"); } Toast.makeText(this, id+"\n"+recipe, Toast.LENGTH_SHORT).show(); bg.setBackgroundResource(getImageId(this, recipe)); } 

Mi problema está en esta parte: String _recipe = cursor.getString(1) . Siempre me da los datos equivocados. Traté de cambiar el número, pero aún así me da datos erróneos.

Esta es mi base de datos:

 package com.pinoycookbook; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class Dbadapter { public static final String ROWID = "_id"; public static final String NAME = "foodname"; public static final String ORIGIN = "origin"; public static final String RECIPE = "recipe"; public static final String CATEGORY = "category"; private static final String TAG = "Dbadapter"; private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; private static final String DATABASE_NAME = "PinoyCookbook.sqlite"; public static final String SQLITE_TABLE = "Food"; private static final int DATABASE_VERSION = 1; private final Context mCtx; private static final String DATABASE_CREATE = "CREATE TABLE if not exists " + SQLITE_TABLE + " (" + ROWID + " integer PRIMARY KEY autoincrement," + NAME + " TEXT," + RECIPE + " TEXT," + ORIGIN + " TEXT," + CATEGORY+ " TEXT,"+ " UNIQUE (" + ROWID +"));"; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.w(TAG, DATABASE_CREATE); db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS " + SQLITE_TABLE); onCreate(db); } } public Dbadapter(Context ctx) { this.mCtx = ctx; } public Dbadapter open() throws SQLException { mDbHelper = new DatabaseHelper(mCtx); mDb = mDbHelper.getWritableDatabase(); return this; } public void close() { if (mDbHelper != null) { mDbHelper.close(); } } public long createData(String foodname, String recipe, String origin, int i) { ContentValues initialValues = new ContentValues(); initialValues.put(NAME, foodname); initialValues.put(RECIPE, recipe); initialValues.put(ORIGIN, origin); initialValues.put(CATEGORY, i); return mDb.insert(SQLITE_TABLE, null, initialValues); } public boolean deleteAllData() { int doneDelete = 0; doneDelete = mDb.delete(SQLITE_TABLE, null , null); Log.w(TAG, Integer.toString(doneDelete)); return doneDelete > 0; } public void insertData() { createData("Adobong Manok","adobongmanok","Manila",1); createData("Lechon","lechon","Cebu",2); createData("Crispy Pata","crispypata","Cebu",2); createData("Bulalo","bulalo","Batangas",1); createData("Taba ng Talangka Rice","talangkarice","Roxas",2); createData("Arroz Caldo","arrozcaldo","Roxas",2); createData("Sinigang","sinigang","Manila",1); } } 

Así que te recomiendo que getColumnIndex() método getColumnIndex() lugar de codificarlo.

 String _recipe = cursor.getString(cursor.getColumnIndex(Dbadapter.RECIPE)); 

Se asegurará de que obtendrá siempre el derecho campo. Y si todavía se equivoca el problema de los datos está en la consulta no en Cursor

Nota: El uso de campos estáticos que contienen nombres de columnas es siempre la mejor práctica.

Actualizar:

Lo he intentado antes y me da este error: java.lang.IllegalArgumentException: la columna 'receta' no existe

Necesita averiguar la estructura real de su mesa. Intente realizar esta declaración:

 PRAGMA table_info(Dbadapter.SQLITE_TABLE); 

Qué dice docs ( fuente ):

Este pragma devuelve una fila para cada columna de la tabla denominada. Las columnas del conjunto de resultados incluyen el nombre de la columna, el tipo de datos, si la columna puede ser NULL y el valor predeterminado de la columna. La columna "pk" del conjunto de resultados es cero para las columnas que no forman parte de la clave principal y es el índice de la columna de la clave principal para las columnas que forman parte de la clave principal.

Ejemplo:

Aquí he creado para usted método para obtener tableinfo a través de PRAGMA :

 public String getTableInfo() { StringBuilder b = new StringBuilder(""); Cursor c = null; try { db = helper.getReadableDatabase(); String query = "pragma table_info(" + Dbadapter.SQLITE_TABLE + ")"; c = db.rawQuery(query, null); if (c.moveToFirst()) { do { b.append("Col:" + c.getString(c.getColumnIndex("name")) + " "); b.append(c.getString(c.getColumnIndex("type"))); b.append("\n"); } while (c.moveToNext()); } return b.toString(); } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } 

La salida será algo como esto:

 Column: type text Column: date text 

Solamente para la imaginación le daré la pantalla:

Captura de pantalla de ejemplo de Android de Pragram

Usted puede intentar de esta manera:

 cursor.getString(cursor.getColumnIndex("recipe")); 

Le devuelve el índice correcto y como resultado el valor correcto.

  • Problema de orden de consultas SQLite de Android
  • Cómo insertar marca de tiempo en una columna de base de datos SQLite? Utilizando el tiempo de función ('ahora')?
  • Ningún campo de instancia
  • Android: dónde almacenar el archivo Selector (xml) para los controles de diseño personalizados
  • ¿Cómo puedo transferir elementos duplicados en otro ArrayList?
  • método "onClick" en butterknife no es un trabajo?
  • El teclado virtual cubre un EditText en un PopupWindow
  • Burbuja de discurso drawable de Android
  • RuntimeException mientras utiliza ActivityUnitTestCase, pero no mientras ActivityInstrumentationTestCase2
  • Cómo el calendario de Google o Instagram hacer sus aplicaciones todo el tiempo en marcha y funcionando incluso después de la parada de fuerza
  • Android: Incluye tarro externo en la compilación (sin Eclipse)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.