来自SQLitedatabase的Android ListView,可删除可点击的项目

时间:2012-12-03 08:07:13

标签: android android-listview

我试图通过查询我为我的Android应用程序创建的SQLite数据库来填充值列表。当用户单击按钮(DROP)时,活动将更改为ListViewDelete,该ListViewDelete应具有基于ID的Select查询中的所有行的列表。我对如何处理它毫无头绪。我尝试了一些教程,但我的应用程序失败了。这是我的代码:

- MySQLitehelper.java ----

public class MySQLitehelper {

//public static final String TABLE_COMMENTS = "comments";
  public static final String COLUMN_ID = "GWid";
  public static final String COLUMN_DATE = "DateGWU";
  public static final String COLUMN_LOCATION = "location";
  public static final String COLUMN_TIME = "time";

  public static final String TABLE_NAME = "UPDTable";

  private static final String DATABASE_NAME = "UPDdb_version6";
  private static final int DATABASE_VERSION = 6;

  private final Context context;
  GetSet getset = new GetSet();
  public void GetIdForGwid(GetSet get)
  {
     getset=get; 
  }

  // Database creation sql statement
  private static final String DATABASE_CREATE = "CREATE TABLE " + TABLE_NAME +
                                " (" +COLUMN_ID+ " integer," + COLUMN_DATE + " VARCHAR," +
                                COLUMN_LOCATION+" VARCHAR," +COLUMN_TIME +" VARCHAR);";

//  private static final String DATABASE_INSERT = "INSERT INTO " +TABLE_NAME +
//                                              " Values (47688507,'DEC-07-2012','MARVIN 203','20:00');";

  private static final String DATABASE_INSERT = "INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +
          COLUMN_LOCATION+" ," +COLUMN_TIME +" )"  +
                          " Values (47688507,'DEC-07-2012','MARVIN 203','20:00');";



  DatabaseHelper dbhelper;
  SQLiteDatabase db;




 public MySQLitehelper(Context ctx)
  {
      this.context = ctx;
      dbhelper = new DatabaseHelper(ctx);
  }



private static class DatabaseHelper extends SQLiteOpenHelper {

     public DatabaseHelper(Context context)
     {
         super(context,DATABASE_NAME, null,DATABASE_VERSION);
     }

 @Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(DATABASE_CREATE);            //execute create table
    db.execSQL(DATABASE_INSERT);            //execute insert query
    db.execSQL("INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +COLUMN_LOCATION+" ," +COLUMN_TIME +" )" +" Values (47688507,'DEC-22-2012','OLD MAIN','23:00');");
    db.execSQL("INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +COLUMN_LOCATION+" ," +COLUMN_TIME +" )" +" Values (1234567,'DEC-14-2012','FUNGER','12:00');");
    db.execSQL("INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +COLUMN_LOCATION+" ," +COLUMN_TIME +" )" +" Values (7654321,'DEC-29-2012','GELMAN','22:00');");
    db.execSQL("INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +COLUMN_LOCATION+" ," +COLUMN_TIME +" )" +" Values (47688507,'DEC-12-2012','IVORY','23:00');");
 }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    Log.w(MySQLitehelper.class.getName(),
            "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}


// open the DB
 public MySQLitehelper open() throws SQLException
 {
    System.out.println("Inside open function");
     db = dbhelper.getWritableDatabase();
    return this;
 }

 public void close()
 {
     dbhelper.close();
 }



 public void insertRecord(long gwid, String date, String location, String time)
     {
           ContentValues initialValues = new ContentValues();
          initialValues.put(COLUMN_ID, gwid);
          initialValues.put(COLUMN_DATE, date);
          initialValues.put(COLUMN_LOCATION, location);
          initialValues.put(COLUMN_TIME, time);
          db.insert(TABLE_NAME, null, initialValues);
     }

public Cursor getAllrows()      //function to get all rows in the DB. Testing initially.
{

     Cursor cur = db.rawQuery("SELECT * FROM "+TABLE_NAME, null);
     return cur;
}

public Cursor getRecord(long getid) throws SQLException
{
        Cursor mCursor =
        db.query(true, TABLE_NAME, new String[] {COLUMN_ID,
        COLUMN_DATE, COLUMN_LOCATION, COLUMN_TIME},
        COLUMN_ID + "= "+getid, null, null, null, null, null);   //HARDCODED. Please make it dynamic
        if (mCursor != null) 
        {
            mCursor.moveToFirst();
        }
 return mCursor;
}

}

- SelectOptions.java--这里用户点击DROP按钮(btnDrop),然后控制转到下面的活动ListViewDelete.java

public class SelectOptions extends Activity {

protected static final String EXTRA_MESSAGE = "This is a the GWID";
Button btnView, btnDrop, btnLocation;

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


    final Intent intent = getIntent();
    //String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    //long getid = intent.getLongExtra(MainActivity.EXTRA_MESSAGE, defaultValue)
            final Bundle extras = getIntent().getExtras(); 

       if (extras != null) {
           long getid = extras.getLong(MainActivity.EXTRA_MESSAGE,0);

        }

    btnView = (Button)findViewById(R.id.btnViewShift);
    btnDrop = (Button)findViewById(R.id.btnDropShift);
    btnLocation = (Button)findViewById(R.id.btnViewLocation);


    final GetSet gwid = new GetSet();
/*   ArrayList<String> results = new ArrayList<String>();
        SQLiteDatabase sampleDB = null;
        final MySQLitehelper db = null;

        final Dialog diag = null;
        final TextView txt = null;   */
    final MySQLitehelper helper = new MySQLitehelper(this);



    btnView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            helper.open();
            Cursor c = helper.getRecord(extras.getLong(MainActivity.EXTRA_MESSAGE));
        //  List<String> list = new ArrayList<String>();
         //    Cursor cursor = helper.query(constantValues.TABLE_NAME, new String[] { "emailid"},null, null, null, null, null); // here emailid is the field name in the table and contantValues.TABLE_NAME is the table name 
            if (c.moveToFirst()) {
             do {

                 System.out.println("In Do while");
                 DisplayRecord(c); 

             } while (c.moveToNext());
          }
            helper.close(); 
            System.out.println("Out of Do");                

        }  
    });


    btnLocation.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            Intent intent2 = new Intent(SelectOptions.this, MapViewActivity.class);
            //startActivity(intent2);
            startActivity(intent2);


        }
    });

    btnDrop.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent3 = new Intent(SelectOptions.this, ListViewDelete.class);
            //startActivity(intent2);
            intent3.putExtra(EXTRA_MESSAGE, extras.getLong(MainActivity.EXTRA_MESSAGE));
            startActivity(intent3);

        }
    });
}




public void DisplayRecord(Cursor c)
{
    System.out.println("In side toast display function");
    Toast.makeText(this, "id: "+c.getString(0)+"\n"+
            "Date: "+c.getString(1)+"\n"+
            "Location: "+c.getString(2)+"\n"+
            "Time: "+c.getString(3), Toast.LENGTH_LONG).show();
}


}

- ListViewDelete.java

public class ListViewDelete extends ListActivity {


String []list =  {"A","B","C","D"};    //#I just tried to populate a sample list#




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

    final Intent intent = getIntent();
    final Bundle extras = getIntent().getExtras();    //gets the GWID

    final MySQLitehelper dbhelper = new MySQLitehelper(this);

    setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list));
    Cursor c = dbhelper.getRecord(extras.getLong(MainActivity.EXTRA_MESSAGE));
        if (c.moveToFirst())
        {
            do {

                System.out.println("In Do while");
                // DisplayRecord(c); 
                //list[]

                } while (c.moveToNext());
        }
    dbhelper.close();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_list_view_delete, menu);
    return true;
}

}

上述课程需要重组,我似乎没有走上正轨。任何帮助,将不胜感激。感谢

1 个答案:

答案 0 :(得分:2)

处理像这些imo这样的事情的最好方法是使用由cursorAdapter支持的列表视图,而不是由另一种适配器支持的列表视图。这是ListViewDelete类的重组,包括simpleCursorAdapter。缺点是你必须知道适配器将要写入的textViews的id。好处是您可以使用适配器直接引用数据库行来实现它。

import android.support.v4.widget.SimpleCursorAdapter; // < --- make sure it's this one

...

public class ListViewDelete extends ListActivity {

    private MySQLitehelper dbhelper;
    private SimpleCursorAdapter adapter;

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

        final Intent intent = getIntent();
        final Bundle extras = getIntent().getExtras();    //gets the GWID

        dbhelper = new MySQLitehelper(this);
        Cursor c = dbhelper.getRecord(extras.getLong(MainActivity.EXTRA_MESSAGE));

        //    SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, layout, c, from, to, flags) 
        //    ^ I wanted you to see the parameters

        adapter = new SimpleCursorAdapter(
                this, 
                R.layout.delete_activity,
                // ^ custom xml holding a layout to be used for each row of your listview
                c, 
                new String[]{MySQLitehelper.COLUMN_DATE, MySQLitehelper.COLUMN_LOCATION, MySQLitehelper.COLUMN_TIME},
                // ^ an array of the database columns that you want
                new int[]{R.id.text1, R.id.text2, R.id.text3},
                // ^ the textView ids (in your custom layout) that you wanted the columns to be mapped to 1 to 1 
                0);
        // ^ just put 0 for that


        setListAdapter(adapter);
    }

    private void refreshListview() {
        Cursor c = dbhelper.getRecord(extras.getLong(MainActivity.EXTRA_MESSAGE));
        adapter.changeCursor(c);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        // where the delete action is gonna take place
        dbhelper.deleteRow(id);
        // when they click a row, the database will delete by id
        // which the onListItemClick method conveniently provides with a cursorAdapter
        refreshListview();
        // then we refresh the listview to see the changes.
        // you might want to make an "delete? are you sure?" dialog or something for your own implementations.
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_list_view_delete, menu);
        return true;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        dbhelper.close();
    }
}

正在引用的MySQLitehelper数据库类中的删除方法:

public boolean deleteRow(long rowId) {
    return db.delete(TABLE_NAME, COLUMN_ID + "=" + rowId, null) > 0;
}