Android的SQLite的cursoroutofboundsexception [英] Android SQLite cursoroutofboundsexception

查看:185
本文介绍了Android的SQLite的cursoroutofboundsexception的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题与SQLite的获取对象(getRecipe()方法),我得到一个cursoroutofbounds例外。

Problem with getting an object (getRecipe() method) from the SQLite as I get an cursoroutofbounds exception.

下面是code:

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.apps.database.sqlite.model.Ingredients;
import com.apps.database.sqlite.model.Photo;
import com.apps.database.sqlite.model.Recipe;

public class RecipeDbHelper extends SQLiteOpenHelper {
    private static final String LOG = "DatabaseHelper";
    private static final String DATABASE_NAME = "RecipeManager";
    private static final int DATABASE_VERSION = 11;
    private static final String TABLE_RECIPE = "recipe";
    private static final String TABLE_INGREDIENT = "ingredients";
    private static final String TABLE_PHOTO = "photo";
    private static final String TABLE_PROCESSING = "processing";
    private static final String KEY_ID = "recipe_id";

    public RecipeDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        for (int i = 0; i < createTables().length; i++) {
            db.execSQL(createTables()[i]);
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECIPE);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_INGREDIENT);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_PHOTO);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_PROCESSING);

        // create new tables
        onCreate(db);

    }

    private String[] createTables() {
        String[] tables = new String[4];

        final String CREATE_TABLE_RECIPE = "CREATE TABLE " + TABLE_RECIPE + "("
                + KEY_ID + " INTEGER PRIMARY KEY, title TEXT)";
        final String CREATE_TABLE_INGREDIENTS = "CREATE TABLE "
                + TABLE_INGREDIENT + "(" + KEY_ID + " INTEGER REFERENCES "
                + TABLE_RECIPE + ", foodname TEXT, "
                + "amount real, measurement String, " + "PRIMARY KEY(" + KEY_ID
                + ", foodname))";
        final String CREATE_TABLE_PHOTO = "CREATE TABLE " + TABLE_PHOTO + "("
                + KEY_ID + " INTEGER PRIMARY KEY REFERENCES " + TABLE_RECIPE
                + ", pathfile TEXT)";

        final String CREATE_TABLE_PROCESSING = "CREATE TABLE "
                + TABLE_PROCESSING + "( " + KEY_ID
                + " INTEGER PRIMARY KEY, description TEXT)";

        tables[0] = CREATE_TABLE_RECIPE;
        tables[1] = CREATE_TABLE_INGREDIENTS;
        tables[2] = CREATE_TABLE_PHOTO;
        tables[3] = CREATE_TABLE_PROCESSING;
        return tables;
    }

    public boolean addRecipe(Recipe recipe) {

        for (Recipe rep : getAllRecipes()) {
            if (recipe.getTitle().equals(rep.getTitle())) {
                return false;
            }
        }
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues value = new ContentValues();

        value.put(KEY_ID, recipe.getRecipe_id());
        value.put("title", recipe.getTitle());
        db.insert(TABLE_RECIPE, null, value);
        db.close();
        return true;

    }

    public Recipe getRecipe(String name) {
        Recipe recipe = null;
        String KEY_TITLE = "title";
        SQLiteDatabase db = this.getReadableDatabase();
        String selectQuery = "SELECT * FROM " + TABLE_RECIPE
                + " WHERE "+ KEY_TITLE +" = '" + name + "'";
        Cursor cursor = db.rawQuery(selectQuery, null);
        recipe = new Recipe(cursor.getColumnIndex(KEY_ID),
                cursor.getString(cursor.getColumnIndex(KEY_TITLE)));

        cursor.close();
        return recipe;


          //REST OF THE CODE NOT INCLUDED
    }
}

任何提示将是非常好的!我真的卡住例外,我从getRecipe()方法得到。

Any tips would be really good! I am really stuck on the exception I get from the getRecipe() method.

推荐答案

getRecipe()

 Cursor cursor = db.rawQuery(selectQuery, null); 
 if(cursor.moveToFirst())
 {
 recipe = new Recipe(cursor.getColumnIndex(KEY_ID),
 cursor.getString(cursor.getColumnIndex(KEY_TITLE))); 
 cursor.close();
 return recipe; 
 }
  return null;

参考:

<一个href=\"http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery(java.lang.String\" rel=\"nofollow\">http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery(java.lang.String, java.lang.String中[])

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery(java.lang.String, java.lang.String[])

由于建议的Selvin后重新检查文档

As suggested by Selvin and after re-checking docs

rawQuery 返回游标对象,它被定位在第一项之前。
所以光标不为空。

rawQuery returns a Cursor object, which is positioned before the first entry. So cursor is not null.

此外

public abstract boolean moveToFirst ()

Added in API level 1
Move the cursor to the first row.

This method will return false if the cursor is empty.

因此​​,如果游标不为空,它返回true否则返回false。所以,我们实在没有必要检查是否光标null作为我第一次公布。

So if cursor is not empty its returns true else returns false. So there is really no need to check if cursor is null as i first posted.

类似的帖子

<一个href=\"http://stackoverflow.com/questions/14446494/android-sqlite-db-query-leads-to-cursorindexoutofboundsexception\">Android sqlite的db.query导致CursorIndexOutOfBoundsException

这篇关于Android的SQLite的cursoroutofboundsexception的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆