1

我正在做一个应用程序,让你编写活动来做。在主要活动上,有一个 ListView,它根据 DialogFragment 内的 DatePicker 中指定的日期显示活动。我正在使用 SQLite 来保存活动,到目前为止保存它们没有问题。如果您长按 ListView 的某个项目,则会出现一个带有单个选项“删除活动”的上下文菜单,调用方法 removeActivity,该方法从静态 ArrayList System.activities 中删除活动,该活动存储创建的每个活动,并且应该删除来自数据库的活动,使用活动的属性 cod,该属性对于活动的每个实例都是唯一的。

public class Main extends FragmentActivity {
    int mDay = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
    int mMonth = Calendar.getInstance().get(Calendar.MONTH); // August, month
                                                                // starts from 0
    int mYear = Calendar.getInstance().get(Calendar.YEAR);
    ArrayList<String> listNames = new ArrayList<String>();
    List<ActivityToDo> acts = System.activities;
    boolean listHasItems = false;
    int position;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Remove title bar
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    removeActivitesBeforeCurrentDate();
    ToDoSQLiteHelper actdb = new ToDoSQLiteHelper(this, "db", null, 1);
    SQLiteDatabase db = actdb.getReadableDatabase();
    Cursor c = db.rawQuery("SELECT * FROM Activities", null);
    System.activities.clear();
    if (c.moveToFirst()) {
        do {
            ActivityToDo act = new ActivityToDo(c.getString(1),
                    c.getString(2), c.getString(3));
            act.setDate(Integer.parseInt(c.getString(4)),
                    Integer.parseInt(c.getString(5)),
                    Integer.parseInt(c.getString(6)));
            System.activities.add(act);
        } while (c.moveToNext());
    }

    db.close();
    setContentView(R.layout.main);
    final Button btnNewAct = (Button) findViewById(R.id.btnNewAct);
    final TextView txtV = (TextView) findViewById(R.id.txtPickDate);
    final ListView listview = (ListView) findViewById(R.id.listview);
    listNames.add("Pick date to search activity.");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, listNames);
    listview.setAdapter(adapter);

    registerForContextMenu(listview);

    listview.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            if (listHasItems) {
                ActivityToDo a = acts.get(position);
                String[] datosAct = new String[6];
                datosAct[0] = a.getName();
                datosAct[1] = a.getDescr();
                datosAct[2] = a.getPriority();
                datosAct[3] = Integer.toString(a.getDay());
                datosAct[4] = Integer.toString(a.getMonth());
                datosAct[5] = Integer.toString(a.getYear());
                Intent i = new Intent();
                i.setClass(getApplicationContext(), ShowActivity.class);
                i.putExtra("datos", datosAct);
                startActivity(i);
            }
        }
    });

    final Handler mHandler = new Handler() {
        // This handles the message send from DatePickerDialogFragment on
        // setting date
        @Override
        public void handleMessage(Message m) {
            Bundle b = m.getData();
            mDay = b.getInt("set_day");
            mMonth = b.getInt("set_month");
            mYear = b.getInt("set_year");
            String date = "";
            if (mDay < 10) {
                date += "0" + mDay + "/";
            } else {
                date += mDay + "/";
            }
            int mes = mMonth + 1;
            if (mes < 10) {
                date += "0" + mes + "/";
            } else {
                date += mes + "/";
            }
            date += mYear;
            txtV.setText(date);
            buildList(mDay, mMonth + 1, mYear);
        }
    };

    OnClickListener listener = new OnClickListener() {
        public void onClick(View v) {
            Bundle b = new Bundle();
            b.putInt("set_day", mDay);
            b.putInt("set_month", mMonth);
            b.putInt("set_year", mYear);
            DatePickerDialogFragment datePicker = new DatePickerDialogFragment(
                    mHandler);
            datePicker.setArguments(b);
            android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(datePicker, "date_picker");
            // Opening the DatePicker fragment
            ft.commit();
        }
    };
    txtV.setOnClickListener(listener);
    btnNewAct.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent();
            i.setClass(getApplicationContext(), NewActivity.class);
            startActivity(i);
        }
    });
}

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

protected void buildList(int d, int m, int y) {
    acts = System.searchByDate(d, m, y);
    listNames.clear();
    if (acts != null && acts.size() != 0) {
        for (int i = 0; i < acts.size(); i++) {
            listNames.add(acts.get(i).getName());
        }
        listHasItems = true;
    } else {
        listHasItems = false;
        listNames.add("No activities for that date.");
    }
    ListView listview = (ListView) findViewById(R.id.listview);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, listNames);
    listview.setAdapter(adapter);
}

public void mostrarToast(String txt) {
    Toast toast = Toast.makeText(getApplicationContext(), txt,
            Toast.LENGTH_SHORT);
    toast.show();
}

private void removeActivitesBeforeCurrentDate() {
    ToDoSQLiteHelper actdb = new ToDoSQLiteHelper(getApplicationContext(),
            "db", null, 1);
    SQLiteDatabase db = actdb.getWritableDatabase();
    ActivityToDo aux;
    Cursor c = db.rawQuery("SELECT * FROM Activities", null);
    if (System.activities.size() != 0 && c.moveToFirst()) {
        for (int i = 0; i < System.activities.size(); i++) {
            aux = System.activities.get(i);
            if (aux.getYear() < Calendar.getInstance().get(Calendar.YEAR)
                    && aux.getMonth() - 1 < Calendar.getInstance().get(
                            Calendar.MONTH)
                    && aux.getDay() < Calendar.getInstance().get(
                            Calendar.DAY_OF_MONTH)) {
                System.activities.remove(i);
                int cod = aux.getCod();
                db.execSQL("DELETE FROM Activities WHERE cod=" + cod);
            }
        }
    }
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    if (listHasItems) {
        MenuInflater inflater = getMenuInflater();
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        position = info.position;
        inflater.inflate(R.menu.menulistitem, menu);
    }
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    removeActivity(position);
    buildList(mDay, mMonth + 1, mYear);
    return true;
}

private void removeActivity(int pos) {
    ToDoSQLiteHelper actdb = new ToDoSQLiteHelper(getApplicationContext(),
            "db", null, 1);
    SQLiteDatabase db = actdb.getWritableDatabase();
    ActivityToDo aux;
    Cursor c = db.rawQuery("SELECT * FROM Activities", null);
    if (System.activities.size() != 0 && c.moveToFirst()) {
        aux = System.activities.get(pos);
        System.activities.remove(pos);
        int cod = aux.getCod();
        db.execSQL("DELETE FROM Activities WHERE cod=" + cod);
    }
    c.close();
}

@Override
protected void onPause() {
    super.onPause();
    this.finish();
}

}

但是这db.execSQL("DELETE FROM Activities WHERE cod=" + cod);似乎不适用于数据库中保留的最后一个活动。示例:我选择了一个日期,当天有两个活动,我将它们都删除了,ListView 显示文本“该日期没有活动”,这是应该发生的,但是当我再次启动应用程序时,活动据说最后被删除了,出现在那里。如果该日期只有一个活动也是如此,这就是为什么我说如果它是数据库中的最后一件事,它似乎不会删除活动。知道为什么吗?提前致谢。

我的 SQLite 类:

public class ToDoSQLiteHelper extends SQLiteOpenHelper {
// crear tabla de usuario
// agregar DATE
String sqlCreate = "CREATE TABLE Activities (cod INTEGER, name TEXT, descr TEXT, priority TEXT, day TEXT, month TEXT, year TEXT)";
public ToDoSQLiteHelper(Context contexto, String nombre,
        CursorFactory factory, int version) {
    super(contexto, nombre, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(sqlCreate);
}

@Override
public void onUpgrade(SQLiteDatabase db, int versionAnterior,
        int versionNueva) {
    db.execSQL("DROP TABLE IF EXISTS Activities");
    db.execSQL(sqlCreate);
}

}

4

0 回答 0