2017-02-07 3 views
0

У меня есть активность, которая добавляет элемент в созданную базу данных. Я могу получить этот добавленный элемент, запросив базу данных. Мне интересно, почему, каждый раз, когда я пытаюсь получить Целочисленный основной ключ, связанный с этой строкой, мое приложение падает?Получение 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. 
+0

Каков ваш запрос? – tyczj

+0

Я обновил вопрос, чтобы показать метод запроса. –

+0

Не могли бы вы объяснить, что это должно сделать? –

ответ

0

Проблема была в этом заявлении:

final Cursor query = getActivity().getContentResolver().query(FoodContract.FoodList.CONTENT_URI, null, null, null, null); 

2-й параметр не должен быть нулевым, а столбцы или «проекция», что возвращаемый курсор должен быть «смотреть.» В этом случае:

String[] projection = {FoodContract.FoodList._ID,FoodContract.FoodList.ITEM_NAME}; 

Эта строка [] используется в ContentProvider для доступа к базе данных.

0

Вы пытались дозвониться cursor.moveToFirst() До cursor.MoveToNext()?