У меня есть активность, которая добавляет элемент в созданную базу данных. Я могу получить этот добавленный элемент, запросив базу данных. Мне интересно, почему, каждый раз, когда я пытаюсь получить Целочисленный основной ключ, связанный с этой строкой, мое приложение падает?Получение PRIMARY KEY INTEGER с использованием курсора
Вот мой класс контрактов с БД. Он реализует BaseColumns, который автоматически создает переменную _ID для меня.
public static class FoodList implements BaseColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH).build();
public static final String TABLE_NAME = "food_table";
public static final String ITEM_NAME = "item";
}
Вот моя база данных Класс:
public class FoodDatabase {
private SQLiteDatabase db;
private DatabaseHelper databaseHelper;
private Context context;
public static final int DB_VERSION = 2;
public static final String DB_NAME = "food_list_db";
private final String CREATE_DATABASE = "CREATE TABLE " + FoodContract.FoodList.TABLE_NAME + " ("
+ FoodContract.FoodList._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ FoodContract.FoodList.ITEM_NAME + " TEXT"
+ ");";
public FoodDatabase(Context context){
this.context = context;
databaseHelper = new DatabaseHelper(context);
}
public FoodDatabase openWriteableDB(){
db = databaseHelper.getWritableDatabase();
return this;
}
public FoodDatabase openReadableDB(){
db = databaseHelper.getReadableDatabase();
return this;
}
public long insertRow(ContentValues cv){
return db.insert(FoodContract.FoodList.TABLE_NAME,null,cv);
}
public Cursor getAllRows(String[] projection, String selection, String[] selectionArgs, String sortOrder){
return db.query(FoodContract.FoodList.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
}
public long deleteRow(long id, String whereClause, String[]whereArgs){
return db.delete(FoodContract.FoodList.TABLE_NAME,whereClause,whereArgs);
}
public void closeDB(){
db.close();
}
private class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_DATABASE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + FoodContract.FoodList.TABLE_NAME);
Log.v ("DATABASE", "*********DATABASE DROPPED AND RECREATED*********");
onCreate(db);
}
}}
Вот что оператор запроса выглядит в моей основной фрагмент. Курсор извлекается из класса ContentProvider ...
try{
final Cursor query = getActivity().getContentResolver().query(FoodContract.FoodList.CONTENT_URI, null, null, null, null);
}catch (Exception e){
e.printStackTrace();
Log.v(TAG, "****************Failed to Open**************");
}
А вот утверждение, что вызывает приложение к сбою в методе запроса моего содержания провайдера. Опять же, я могу получить строку, но не длинный идентификатор. Кто-нибудь знает, почему?
while(cursor.moveToNext()) {
Long id = cursor.getLong(cursor.getColumnIndex(FoodContract.FoodList._ID));
String item = cursor.getString(cursor.getColumnIndex(FoodContract.FoodList.ITEM_NAME));
Log.v(TAG, "*********id = " + id + " ITEM = " + item + "************");
}
Вот Exception
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.
Каков ваш запрос? – tyczj
Я обновил вопрос, чтобы показать метод запроса. –
Не могли бы вы объяснить, что это должно сделать? –