Я создаю простую базу данных SQLite в классе DatabaseHelper, который расширяет SQLiteOpenHelper. База данных содержит два столбца: NAME и ОПИСАНИЕ. Вот метод, который работает в моем методе OnCreate в классе DatabaseHelperSQLite Database _id Integer Issue
@Override
public void onCreate(SQLiteDatabase db) {
updateMyDatabase(db, 0, DATABASE_VERSION);
}
private void updateMyDatabase(SQLiteDatabase db, int olderVersion, int newerVersion){
if (olderVersion<1){
db.execSQL("CREATE TABLE MARK (_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "NAME TEXT, "
+ "DESCRIPTION TEXT);");
insertDrink(db,"latte","Espresso and Steamed Milk");
insertDrink(db, "cappuccino", "This a Cappuccino");
}
}
private static void insertDrink(SQLiteDatabase database, String name, String description){
ContentValues drinkValues = new ContentValues();
drinkValues.put("NAME", name);
drinkValues.put("DESCRIPTION",description);
database.insert("MARK",null,drinkValues);
}
Мой конкретный вопрос относительно _id INTEGER PRIMARY KEY, используемой при создании базы данных. Это число начинается с 1 или 0?
Вот почему я задаюсь вопросом. У меня есть простой ListView с двумя элементами. Я нажимаю на первый элемент и передаю позицию ListView, равную 0, в другую активность.
listView.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch(position){
case 0:{
Intent i = new Intent(MainActivity.this, Details.class);
i.putExtra(Details.EXTRA_DRINKNUM,(int)id);
startActivity(i);
break;
}
case 1:{
Intent i = new Intent(MainActivity.this, Details.class);
i.putExtra(Details.EXTRA_DRINKNUM,(int)id);
startActivity(i);
break;
}
}
}
});
Затем я извлекаю это число в пределах этого действия и поместил его в переменную с именем clickNum.
Затем я использую clickNum для запроса к базе данных:
SQLiteOpenHelper database = new DatabaseHelper(this);
SQLiteDatabase db = database.getReadableDatabase();
Cursor cursor = db.query("MARK",
new String[]{"NAME","DESCRIPTION"},
"_id = ?",
new String[]{Integer.toString(clickNum)},
null,null,null);
Я могу только подтянуть свою первую строку, содержащую данные (латте ....) если я drinkNum + 1. Почему? Должна ли первая строка _id быть 0 ???
Вот более детальный взгляд на классе (подробность), который запрашивает базу данных:
public class Details extends AppCompatActivity {
private TextView name, description;
public static final String EXTRA_DRINKNUM = "DrinkNum";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
name = (TextView)findViewById(R.id.detailsCoffeeName);
description = (TextView)findViewById(R.id.detailsCoffeeDescription);
int clickNum = (Integer)getIntent().getExtras().get(EXTRA_DRINKNUM);
ContentValues values = new ContentValues();
values.put("DESCRIPTION", "Lateeeee");
try{
SQLiteOpenHelper database = new DatabaseHelper(this);
SQLiteDatabase db = database.getReadableDatabase();
Cursor cursor = db.query("MARK",
new String[]{"NAME","DESCRIPTION"},
"_id = ?",
new String[]{Integer.toString(clickNum)},
null,null,null);
if (cursor.moveToFirst()){
String nameText = cursor.getString(0);
String descriptionText = cursor.getString(1);
name.setText(nameText);
description.setText(descriptionText);
}else{
Log.v("Details", "Nothing Found");
}
cursor.close();
db.close();
}catch(SQLiteException e){
e.printStackTrace();
Toast.makeText(this, "Database Issue", Toast.LENGTH_LONG).show();
}
У вас есть ошибка в вашем приложении: вы предполагая, что позиция 'ListView'' имеет какое-либо отношение к значению '_ID'. Как правило, они не совпадают либо из-за манипуляции с базой данных (например, с удалением строки), либо с помощью приложения (например, сортировка результатов). Используйте значение '_ID', пожалуйста. Например, «длинный идентификатор», переданный в ваш прослушиватель элементов, равен '_ID', а' getItemId() 'на' CursorAdapter' предоставит вам '_ID' для данной' позиции'. – CommonsWare
Извините, я не был более ясен. Да, в моем itemClickListener я передаю длинный идентификатор следующему действию. Я извлекаю его там в переменной, называемой clickNum, а затем использую ее для запроса базы данных. Моя проблема в том, что длинный идентификатор, который я передаю, например, 0 для первого элемента, не вызывает первую строку моей базы данных. Он вызывает только первую строку, если я добавлю 1 к длинному идентификатору, который я передал (clickNum + 1). Это потому, что AutoIncrement базы данных начинается с 1, а не 0? –
«Это потому, что автоинкремент базы данных начинается с 1, а не 0?» - нет. Где 'clickNum' происходит из' Integer.toString (clickNum) '? Вы действительно уверены, что это происходит из 'Details.EXTRA_DRINKNUM'? – CommonsWare