0
我在DatabaseHelper類中創建了一個簡單的SQLite數據庫,它擴展了SQLiteOpenHelper。數據庫包含兩列NAME和DESCRIPTION。下面是我的onCreate方法的DatabaseHelper類SQLite數據庫_id整數問題
@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;
}
}
}
});
然後,我在該Activity中檢索該數字,並將其置於一個名爲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'值。例如,傳遞給你的項目點擊偵聽器的'long id'是'_ID','CursorAdapter'上的'getItemId()'會給你'_ID'給定''position''。 – CommonsWare
對不起,我不是更清楚,是的,在我的itemClickListener中,我將一個很長的ID傳遞給下一個活動。我在一個名爲clickNum的變量中檢索它,然後用它來查詢數據庫。我的問題是,我通過的長ID,例如對於第一個項目0沒有調出我的數據庫的第一行。它只會引出第一行,如果我添加1到我通過的長ID(clickNum + 1)。那是因爲數據庫的自動增量從1開始而不是0? –
「是因爲數據庫的自動增量從1開始而不是0?」 - 沒有。你的'Integer.toString(clickNum)''中的'clickNum'來自哪裏?你真的確定它來自'Details.EXTRA_DRINKNUM'嗎? – CommonsWare