2015-10-14 101 views
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(); 

    } 
+0

你在你的應用程序中的錯誤:你是假設'ListView''位置'與'_ID'值有任何關係。由於數據庫操作(例如,刪除行)或應用操作(例如對結果進行排序),這些通常不匹配。請使用'_ID'值。例如,傳遞給你的項目點擊偵聽器的'long id'是'_ID','CursorAdapter'上的'getItemId()'會給你'_ID'給定''position''。 – CommonsWare

+0

對不起,我不是更清楚,是的,在我的itemClickListener中,我將一個很長的ID傳遞給下一個活動。我在一個名爲clickNum的變量中檢索它,然後用它來查詢數據庫。我的問題是,我通過的長ID,例如對於第一個項目0沒有調出我的數據庫的第一行。它只會引出第一行,如果我添加1到我通過的長ID(clickNum + 1)。那是因爲數據庫的自動增量從1開始而不是0? –

+0

「是因爲數據庫的自動增量從1開始而不是0?」 - 沒有。你的'Integer.toString(clickNum)''中的'clickNum'來自哪裏?你真的確定它來自'Details.EXTRA_DRINKNUM'嗎? – CommonsWare

回答

1

數據庫的自動增量從1開始:)