java - cursor.getstring() 在数据库中获取错误的字段

标签 java android database

所以这是我的代码:

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

这是我下一个 Activity 的代码:

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

我的问题出在这部分:String _recipe = cursor.getString(1)。 它总是给我错误的数据。我试图更改号码,但它仍然给我错误的数据。

这是我的数据库:

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

最佳答案

所以我推荐你使用getColumnIndex()方法而不是对其进行硬编码。

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

它将确保您始终获得正确的字段。如果它仍然得到错误的数据问题是在查询中不在 Cursor

注意:使用包含列名称的静态字段始终是最佳实践。

更新:

I've tried it before and it gives me this error: java.lang.IllegalArgumentException: column 'recipe' does not exist

你需要找出你实际的表结构。尝试执行此语句:

PRAGMA table_info(Dbadapter.SQLITE_TABLE);

文档是怎么说的(source):

This pragma returns one row for each column in the named table. Columns in the result set include the column name, data type, whether or not the column can be NULL, and the default value for the column. The "pk" column in the result set is zero for columns that are not part of the primary key, and is the index of the column in the primary key for columns that are part of the primary key.

示例:

我在这里为您创建了通过 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();
        }
    }
}

输出将是这样的:

Column: type text
Column: date text

只为想象我给你屏幕:

Pragram Android Example Screenshot

关于java - cursor.getstring() 在数据库中获取错误的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15680853/

相关文章:

java - ViewPager通用图像加载器如何实现

android - 通知 "setContentInfo"未显示

php - 在一行中将数​​组插入数据库

java - 如何使用 JavaFXPorts 在 Android 中启用 JavaFX 虚拟键盘

java - 如何在 recyclerview 项目中获取 TextView 的值?

java - 我可以更改可序列化类的成员变量类型吗?

android - Tensorflow 中的 'Const Op' 是什么?

sql-server - Azure 上的 SQL Server 数据库大小限制,该怎么办?

php - Drupal 数据库连接查询

java - 将 SWT 元素与 Slick2D 结合使用