2015-10-14 3 views
0

Я создаю простую базу данных 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(); 

    } 
+0

У вас есть ошибка в вашем приложении: вы предполагая, что позиция 'ListView'' имеет какое-либо отношение к значению '_ID'. Как правило, они не совпадают либо из-за манипуляции с базой данных (например, с удалением строки), либо с помощью приложения (например, сортировка результатов). Используйте значение '_ID', пожалуйста. Например, «длинный идентификатор», переданный в ваш прослушиватель элементов, равен '_ID', а' getItemId() 'на' CursorAdapter' предоставит вам '_ID' для данной' позиции'. – CommonsWare

+0

Извините, я не был более ясен. Да, в моем itemClickListener я передаю длинный идентификатор следующему действию. Я извлекаю его там в переменной, называемой clickNum, а затем использую ее для запроса базы данных. Моя проблема в том, что длинный идентификатор, который я передаю, например, 0 для первого элемента, не вызывает первую строку моей базы данных. Он вызывает только первую строку, если я добавлю 1 к длинному идентификатору, который я передал (clickNum + 1). Это потому, что AutoIncrement базы данных начинается с 1, а не 0? –

+0

«Это потому, что автоинкремент базы данных начинается с 1, а не 0?» - нет. Где 'clickNum' происходит из' Integer.toString (clickNum) '? Вы действительно уверены, что это происходит из 'Details.EXTRA_DRINKNUM'? – CommonsWare

ответ

1

базы в Auto Increment начинается с 1. :)