2016-06-13 81 views
2

我有一個SQLite數據庫和ListView顯示在主要活動。在ListView中,我顯示每個清單編號的詳細信息,並在按下清單項時打開一個新活動,其中顯示TextView中的詳細信息。SQLite行ID與ListView行ID不匹配

我有這些ListView s中的每一個的刪除功能,它們不能正常工作。實質上,每個創建的ListView都有一個唯一的ID,SQLite數據庫應該如何工作。但是,在刪除ListView中的一行時,唯一標識會增加,但行標識將刪除該數字並將所有內容向上移動。這意味着在您刪除一個項目後,行ID和數據庫ID不再匹配,當嘗試選擇ListView中的項目時,它會崩潰。這是我的數據庫適配器類的摘錄:

public Integer deleteStat(Integer id) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete(STATS_TABLE, "id = ? ", new String[]{Integer.toString(id)}); 
} 

這是我第一次嘗試主要活動。我得到了一些信息,從this後但未能獲得正確的整數並收到語法錯誤:

obj.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

TextView pos = (TextView) findViewById(R.id.editTitle); 
displayText(Integer.parseInt(pos.getText().toString())); 
     } 
    }); 
} 

public void displayText(int pos) 
{ 
    pos++; 
    String s = ""; 
    s += pos; 

    Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class); 
    intent.putExtra("id", s); 
    startActivity(intent); 

} 

這是我的主要活動的第二次嘗試。我用this教程來幫助我。我從該網站使用的代碼破壞了整個刪除功能:

obj.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
      int id_To_Search = arg2 + 1; 
      int id_To_Search = arg0.getCount() - arg2; 

      Bundle dataBundle = new Bundle(); 
      dataBundle.putInt("id", id_To_Search); 

      Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class); 

      intent.putExtras(dataBundle); 
      startActivity(intent); 

如何獲取數據庫ID以匹配行ID?有關如何做到這一點的任何建議?

編輯:添加在哈希圖代碼。當我按一個ListView項目,什麼都不會發生

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

    mydb = new StatisticsDbAdapter(this); 
    ArrayList array_list = mydb.getAllStats(); 
    ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array_list); 

    obj = (ListView) findViewById(R.id.listView1); 
    obj.setAdapter(arrayAdapter); 
    /* 
    New code starts here 
    */ 
    Bundle extras = getIntent().getExtras(); 
    if (extras != null) { 
     int Value = extras.getInt("id"); 

     if (Value > 0) { 
      //means this is the view part not the add contact part 
      Cursor cursor = mydb.getData(Value); 
      hashMap.put(cursor.getString(1), cursor.getInt(0)); 

obj.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int arg2, long arg3) { 
    TextView textView = (TextView) view.findViewById(R.id.editTitle); 
        Bundle dataBundle = new Bundle(); 
        dataBundle.putInt("id", hashMap.get(textView.getText().toString())); 

        Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class); 

        intent.putExtras(dataBundle); 
        startActivity(intent); 
} 
      }); 
     } 
    } 
} 
+1

'SQLite行ID不匹配ListView'這很明顯。想象一下你的ID以953開頭(因爲你做了很多試驗並且刪除了所有的測試記錄)。你是否假裝你的ListView從項目編號953開始?不,顯然不是。它將開始填充ITS項目編號爲0的項目。 – 2016-06-13 18:52:24

+0

那麼,如何在確保數據庫ID在從列表視圖中刪除行之後確保數據庫ID保持與行ID一致?當我嘗試點擊它們回調它們時? –

+0

谷歌關鍵字:'android listview database delete' – 2016-06-13 20:52:03

回答

0

你不應該傳遞一個ListView位置數據庫中刪除行。我以前做過很多次了。首先,在班級內部管理點擊事件,創建一個新的HashMap。這HashMap將用於存儲我們從數據庫中的行ID,我們會參考,而不是ListView項目的位置。要創建它,輸入這個代碼:

public HashMap<String, Integer> hashMap = new HashMap<>(); 

一旦你這樣做,在你顯示所有在ListView行的功能,還必須在相同的項目加載到HashMap這樣的:

hashMap.put(cursor.getString(1), cursor.getInt(0)); 

請注意cursor.getString(1)可能不是您使用的。請將1替換爲您的名稱存儲在其中的適當列號。 cursor.getInt(0)從數據庫中獲取行ID,列號也可能因您而異。現在,我們的OnClickListener函數中,我們可以輸入:

obj.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view) { 
     TextView textView = (TextView) view.findViewById(R.id.editTitle); 
     Bundle bundle = new Bundle(); 
     bundle.putInt("id", hashMap.get(textView.getText().toString())); 

     Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class); 

     intent.putExtras(bundle); 
     startActivity(intent); 
} 

請注意:hashMap變量需要在同一類的,你管理你的ListView的單擊事件或者你會得到錯誤。由於您不需要它們,因此您最初傳遞的一些參數已被刪除。另外,我發現使用RecyclerView可以更好地工作,但現在取決於您。如果您遇到問題,請不要猶豫,以下評論,我會盡快回答。

+0

嘿,非常感謝你的迴應! 我試圖添加一些東西,並且hashMap似乎正在工作。 但是,當我點擊一些我目前正在添加的項目時,現在沒有任何事情發生。 我認爲它可能有一些做的線 'TextView的POS =(TextView的)findViewById(R.id.editTitle);' 你認爲我不應該在這裏呼籲的標題行?我不確定我應該在TextView中引用哪個變量,因爲我相信該行只是爲了獲取數據應該來自的ID。 讓我認識你的想法! –

+0

這可能是你提到的那條線。我推薦的是你訪問[this](http://stackoverflow.com/questions/9208827/how-to-extract-the-text-from-the-se- selection-item-on-the-listview)鏈接並獲取所選項目的TextView值並傳遞它。 – 2016-06-14 02:50:40

+0

請檢查我再次提供給您的代碼。我調整了一些現在應該可以工作的東西。 – 2016-06-14 04:07:47