2016-02-23 34 views
-1
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    addBtn = (Button)findViewById(R.id.addBtn); 
    itemInput = (EditText)findViewById(R.id.itemInput); 

    addBtn.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      addItem(itemInput.getText().toString()); 
      itemInput.setText(""); 
     } 
    }); 

    handler = new MyDbHandler(this,null,null,1); 

    mylist = (ListView) findViewById(R.id.listView); 
    mylist.setOnItemClickListener(
      new AdapterView.OnItemClickListener() 
    { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 

      Log.d("Clicked item id", " "+position); 

     } 

    }); 
    getList(); 

} 

以上是我的主要活動,環顧四周後,我發現了一個解決方案,說位置參數表示數據庫中,但我的項目ID沒有爲我工作。我想獲得在我的列表中點擊的項目的數據庫ID。我有麻煩檢索項目的數據庫的ID點擊列表上

package com.lagfvu.quicklist; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

import java.util.ArrayList; 

/** 
* Created by musaddiq on 2/23/16. 
*/ 
public class MyDbHandler extends SQLiteOpenHelper 
{ 
    private static final int DATABASE_VERSION = 5; 
    private static final String DATABASE_NAME = "quicklist.db"; 
    private static final String ITEMS_TABLE = "list"; 
    private static final String COLUMN_ID = "_id"; 
    private static final String COLUMN_NAME = "itemname"; 


    public MyDbHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 
    { 
     super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     String query = "CREATE TABLE "+ ITEMS_TABLE + "(" + COLUMN_ID +" INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_NAME +" TEXT"+");"; 
     db.execSQL(query); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     db.execSQL("DROP TABLE IF EXISTS "+ ITEMS_TABLE); 
     onCreate(db); 
    } 


    public void addItem(String item) 
    { 
     ContentValues cv = new ContentValues(); 
     cv.put(COLUMN_NAME,item); 
     SQLiteDatabase db = getWritableDatabase(); 
     db.insert(ITEMS_TABLE, null, cv); 
     db.close(); 
    } 

    public void deleteItem(long id) 
    { 
     SQLiteDatabase db = getWritableDatabase(); 
     db.execSQL("DELETE FROM " + ITEMS_TABLE + " WHERE " + COLUMN_ID + "=\"" + id + "\";"); 
    } 

    //print out as string 

    public ArrayList<String> DbToList() 
    { 
     ArrayList<String> itemList = new ArrayList<>(); 

     SQLiteDatabase db = getWritableDatabase(); 


     String query = "SELECT "+ COLUMN_NAME +" FROM "+ ITEMS_TABLE + "\n"; 

     //cursor pointer 
     Cursor cursor = db.rawQuery(query,null); 

     //move to first row in results 
     cursor.moveToFirst(); 
     while(!cursor.isAfterLast()) 
     { 
      if(cursor.getString(cursor.getColumnIndex("itemname"))!= null) 
      { 
       itemList.add(cursor.getString(cursor.getColumnIndex("itemname"))); 
      } 
      cursor.moveToNext(); 
     } 

     db.close(); 
     return itemList; 
    } 
} 

這是我的dbhandler類。

+0

後MyDbHandler.java –

+0

類的,你用什麼方法在MyDbHandler類從數據庫中提取數據的代碼。 –

+0

@UsmanAsghar我已添加代碼。我能夠從我的數據庫中獲取所有項目。問題是從列表中獲取單擊的項目的ID,所以我可以刪除它從分區 – lagfvu

回答

1

你有沒有MyDbHandler類中的任何方法來獲取數據。 從數據庫獲取數據。 將該代碼粘貼到MyDbHandler.java類中。


public Cursor fetchAllData() { 
    SQLiteDatabase mDb = getWritableDatabase(); 
     Cursor mCursor = mDb.query(ITEMS_TABLE, new String[]{COLUMN_ID, COLUMN_NAME}, 
       null, null, null, null, null); 

     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 
     return mCursor; 
    } 

獲取特定項目_id與光標的幫助。

粘貼代碼MainActivity.java


MyDbHandler handler = new MyDbHandler(this,"quicklist.db",null,1); 

    ListView mylist = (ListView) findViewById(R.id.listView); 
    mylist.setOnItemClickListener(
      new AdapterView.OnItemClickListener() 
    { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      Cursor cursor=handler.fetchAllData(); 
      cursor.moveToPosition(position); 
      String _id=cursors.getString(cursor.getColumnIndex("_id")); 
      Log.d("Clicked item id", " "+_id); 

     } 
}); 
+0

以及爲什麼不使用'onItemClick'的最後一個參數? – pskink

+0

我的想法之前並不清楚,因爲我認爲最後兩個參數在所有類型的適配器中都具有相同的功能。但知道我已經知道我們可以使用simplecursoradapter的最後一個參數來獲取行ID。 –

+0

太棒了!這是什麼'長ID'爲 – pskink

1

我在我的應用程序中使用了類似的東西,我使用了複選框的自定義遊標適配器,一旦檢查它將顯示row_id,遊標將用於調用相關信息的數據庫,然後依賴行ID顯示。可能不是最好的方式,但我敢肯定,你可以左右扭動它來滿足您的需求,希望它有助於

import android.content.Context; 
import android.database.Cursor; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.SimpleCursorAdapter; 

public class CustomAdapter extends SimpleCursorAdapter implements CompoundButton.OnCheckedChangeListener { 

private Context mContext; 
private Context appContext; 
private int layout; 
private Cursor cr; 
private final LayoutInflater inflater; 

public CustomAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    this.layout = layout; 
    this.mContext = context; 
    this.inflater = LayoutInflater.from(context); 
    this.cr = c; 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return inflater.inflate(layout, null); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    super.bindView(view, context, cursor); 
    CheckBox checkBox1 = (CheckBox) view.findViewById(R.id.checkBox1); 
    checkBox1.setOnCheckedChangeListener(this); 
    int columnIndex = cursor.getColumnIndex("_id"); 
    int columnvalue = cursor.getInt(columnIndex); 
    checkBox1.setTag(columnvalue); 

} 

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     int id = (Integer) buttonView.getTag(); 
     Toast.makeText(getApplicationContext(), "The id is " + id, Toast.LENGTH_SHORT).show(); 


} 

}