Android的SQLite的cursoroutofboundsexception [英] 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屋!