如何删除的android源码单行 [英] How to delete a single row in android sqlite

查看:104
本文介绍了如何删除的android源码单行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

sqlite的数据重新presented在的ListView CustomListAdapter 点击。对一排的警报对话弹出提示,用户可以从 sqlite的删除单列在我的活动:

 私人无效deleteDialog(){
        AlertDialog.Builder alertDialog =新AlertDialog.Builder(MyCart.this);
        alertDialog.setCancelable(假);
        alertDialog.setMessage(删除项目?);
        alertDialog.setPositiveButton(是,新DialogInterface.OnClickListener(){
            公共无效的onClick(DialogInterface对话,诠释它){
                myDb.deleteSingleContact(的toString());
            }
        });
        alertDialog.setNegativeButton(取消,新DialogInterface.OnClickListener(){
            公共无效的onClick(DialogInterface对话,诠释它){
                dialog.cancel();            }
        });
        alertDialog.show();
    }

在我的DBHelper.java:

 公共无效deleteSingleContact(字符串名称){        SQLiteDatabase分贝= this.getWritableDatabase();
        db.delete(CONTACTS_TABLE_NAME,CONTACTS_COLUMN_TITLE +=?,新的String [] {标题});
// KEY_NAME是一个列名
    }

不过上述code不删anything.I猜测它的功能,我还没有做过correctly.Any建议?

全部DBHelper.java

 公共类DBHelper扩展SQLiteOpenHelper {    公共静态最后弦乐DATABASE_NAME =MyDBName.db;
    公共静态最后弦乐CONTACTS_TABLE_NAME =接触;
    公共静态最后弦乐CONTACTS_COLUMN_ID =ID;
    公共静态最后弦乐CONTACTS_COLUMN_TITLE =称号;
    公共静态最后弦乐CONTACTS_COLUMN_AMOUNT =量;
    公共静态最后弦乐CONTACTS_COLUMN_DESC =说明;    私人HashMap的马力;    公共DBHelper(上下文的背景下){
        超级(上下文,DATABASE_NAME,空,1);
    }    @覆盖
    公共无效的onCreate(SQLiteDatabase DB){
        // TODO自动生成方法存根
        db.execSQL(
                CREATE TABLE接触+
                        (ID整数主键,标题文字,金额浮动,说明文字)
        );
    }    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
        // TODO自动生成方法存根
        db.execSQL(DROP TABLE IF EXISTS接触);
        的onCreate(DB);
    }    公共布尔insertContact(字符串标题,浮动金额,字符串描述){
        SQLiteDatabase分贝= this.getWritableDatabase();
        ContentValues​​ contentValues​​ =新ContentValues​​();        contentValues​​.put(题,题);
        contentValues​​.put(量,量);
        contentValues​​.put(说明,说明);
        db.insert(联系人,空,contentValues​​);
        返回true;
    }    公共光标的getData(INT ID){
        SQLiteDatabase分贝= this.getReadableDatabase();
        光标解析度= db.rawQuery(从通讯录中选择*其中id =+编号+,NULL);
        返回水库;
    }    公众诠释numberOfRows(){
        字符串countQuery =SELECT * FROM+ CONTACTS_TABLE_NAME;
        SQLiteDatabase分贝= this.getReadableDatabase();
        光标光标= db.rawQuery(countQuery,NULL);
        INT CNT = cursor.getCount();
        cursor.close();
        返回CNT;
    }    公共布尔updateContact(整数ID字符串标题,浮动金额,字符串描述){
        SQLiteDatabase分贝= this.getWritableDatabase();
        ContentValues​​ contentValues​​ =新ContentValues​​();
        contentValues​​.put(题,题);
        contentValues​​.put(量,量);
        contentValues​​.put(说明,说明);        db.update(联系人,contentValues​​,ID =?,新的String [] {Integer.toString(ID)});
        返回true;
    }    公共无效deleteContact(){
        SQLiteDatabase分贝= this.getWritableDatabase();
        db.delete(联系人,NULL,NULL);
        db.close();
    }    公共无效deleteSingleContact(字符串名称){        SQLiteDatabase分贝= this.getWritableDatabase();
        db.delete(CONTACTS_TABLE_NAME,CONTACTS_COLUMN_TITLE +=?,新的String [] {标题});
// KEY_NAME是一个列名
    }    公共布尔checkForTables(){
        布尔hasRows = FALSE;
        SQLiteDatabase分贝= getReadableDatabase();
        (FROM SELECT COUNT(*)+ CONTACTS_TABLE_NAME,NULL)光标光标= db.rawQuery;
        cursor.moveToFirst();
        诠释计数= cursor.getInt(0);
        如果(计数大于0)
            hasRows = TRUE;
        db.close();
        返回hasRows;
    }
    公众的ArrayList< ContactListItems> getAllContacts(){
        ArrayList的< ContactListItems> contactList =新的ArrayList<>();
        HP =新的HashMap();
        SQLiteDatabase分贝= this.getReadableDatabase();
        光标解析度= db.rawQuery(从通讯录中选择*,NULL);
        res.moveToFirst();
        而(!res.isAfterLast()){
                ContactListItems contactListItems =新ContactListItems();                contactListItems.setTitle(res.getString(RES
                        .getColumnIndex(标题)));
                contactListItems.setAmount(res.getFloat(RES
                        .getColumnIndex(额)));
                contactListItems.setDescription(res.getString(RES
                        .getColumnIndex(说明)));
                contactList.add(contactListItems);
                res.moveToNext();
            }
        res.close();
        返回contactList;
    }
    公众诠释getTotalOfAmount(){
        SQLiteDatabase分贝= this.getReadableDatabase();
        光标C = db.rawQuery(SELECT SUM(数量)FROM+ CONTACTS_TABLE_NAME,NULL);
        c.moveToFirst();
        INT I = c.getInt(0);
        c.close();
        返回我;
    }
}

修改

  obj.setOnItemLongClickListener(新AdapterView.OnItemLongClickListener(){
            @覆盖
            公共布尔onItemLongClick(适配器视图<>为arg0,ARG1观,诠释ARG2,长ARG3){
                deleteDialog();
                返回true;
            }
        });
    }

logcat的错误:

\r
\r

android.database.sqlite.SQLiteException:近=:语法错误(code1):,在编译:删除联系人WHERE标题=\r
            在android.database.sqlite.SQLiteConnection.native prepareStatement(本机方法)\r
            在android.database.sqlite.SQLiteConnection.acquire preparedStatement(SQLiteConnection.java:882)\r
            在android.database.sqlite.SQLiteConnection。prepare(SQLiteConnection.java:493)\r
            在android.database.sqlite.SQLiteSession。prepare(SQLiteSession.java:588)\r
            在android.database.sqlite.SQLiteProgram<&初始化GT;(SQLiteProgram.java:58)\r
            在android.database.sqlite.SQLiteStatement<&初始化GT;(SQLiteStatement.java:31)\r
            在android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663)\r
            在android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)\r
            在com.softtech.stevekamau.buyathome.DBHelper.removeSingleContact(DBHelper.java:157)\r
            在com.softtech.stevekamau.buyathome.MyCart $ 6.onClick(MyCart.java:140)\r
            在com.android.internal.app.AlertController $ ButtonHandler.handleMessage(AlertController.java:166)\r
            在android.os.Handler.dispatchMessage(Handler.java:99)\r
            在android.os.Looper.loop(Looper.java:137)\r
            在android.app.ActivityThread.main(ActivityThread.java:4745)\r
            在java.lang.reflect.Method.invokeNative(本机方法)\r
            在java.lang.reflect.Method.invoke(Method.java:511)\r
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)\r
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)\r
            在dalvik.system.NativeStart.main(本机方法)

\r

\r
\r


解决方案

您可以使用SQL DELETE语句来选择要删除的条目。
当使用字符串值作为选择,确保你在括值''

  / **
     *删除由标题从数据库中的联系人
     *
     * @参数标题去掉
     * /
    公共无效removeSingleContact(字符串名称){
        //打开数据库
        SQLiteDatabase数据库= this.getWritableDatabase();        //执行SQL查询,以便从数据库中删除
        //注意:当字符串在SQL删除,值必须以括'
        database.execSQL(DELETE FROM+ TABLE_NAME +WHERE+ CONTACTS_COLUMN_TITLE +='+标题+');        //关闭数据库
        database.close();
    }

然后,每当你想从数据库中删除条目使用下列内容:

  DBHelper dbHelper =新DBHelper(背景);
dbHelper.removeSingleContact(CONTACT_TO_REMOVE_HERE);

更新
假设你的的ListView 集是的ArrayList 包含ContactListItems,你可以设置一个 OnItemClickListener 的ListView ,并用它来获得您所选择的标题,然后将其删除。

  listView.setOnItemClickListener(新AdapterView.OnItemClickListener(){    @覆盖
    公共无效onItemClick(适配器视图<>母公司,观景,最终诠释的位置,长的id){        AlertDialog.Builder alertDialog =新AlertDialog.Builder(MyCart.this);
        alertDialog.setCancelable(假);
        alertDialog.setMessage(删除项目?);
        alertDialog.setPositiveButton(是,新DialogInterface.OnClickListener(){
            公共无效的onClick(DialogInterface对话,诠释它){
                字符串称号;                标题= arrayList.get(位置).getTitle();                dbHelper.removeSingleContact(职称);                //更新您的ArrayList
                ArrayList的= dbHelper.getAllContacts();                //通知您的适配器的ListView
                adapter.notifyDataSetChanged();            }
        });
        alertDialog.setNegativeButton(取消,新DialogInterface.OnClickListener(){
            公共无效的onClick(DialogInterface对话,诠释它){
                dialog.cancel();
            }
        });
        alertDialog.show();    }});

I have sqlite data represented on a ListView by a CustomListAdapter.On clicking a row an alert dialogue pops up that prompts the user to delete the single row from sqlite in my activity:

private void deleteDialog() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(MyCart.this);
        alertDialog.setCancelable(false);
        alertDialog.setMessage("Delete item?");
        alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                myDb.deleteSingleContact(toString());
            }
        });
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();

            }
        });
        alertDialog.show();
    }

On my DBHelper.java:

 public void deleteSingleContact(String title){

        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(CONTACTS_TABLE_NAME, CONTACTS_COLUMN_TITLE + "=?", new String[]{title});
//KEY_NAME is a column name
    }

However the above code doesn't delete anything.I guess its the function i havent done correctly.Any suggestions?

Full DBHelper.java

public class DBHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "MyDBName.db";
    public static final String CONTACTS_TABLE_NAME = "contacts";
    public static final String CONTACTS_COLUMN_ID = "id";
    public static final String CONTACTS_COLUMN_TITLE = "title";
    public static final String CONTACTS_COLUMN_AMOUNT = "amount";
    public static final String CONTACTS_COLUMN_DESC = "description";

    private HashMap hp;

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(
                "create table contacts " +
                        "(id integer primary key, title text,amount float,description text)"
        );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS contacts");
        onCreate(db);
    }

    public boolean insertContact(String title,  float amount, String description) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();

        contentValues.put("title", title);
        contentValues.put("amount", amount);
        contentValues.put("description", description);


        db.insert("contacts", null, contentValues);
        return true;
    }

    public Cursor getData(int id) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res = db.rawQuery("select * from contacts where id=" + id + "", null);
        return res;
    }

    public int numberOfRows() {
        String countQuery = "SELECT  * FROM " + CONTACTS_TABLE_NAME;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        int cnt = cursor.getCount();
        cursor.close();
        return cnt;
    }

    public boolean updateContact(Integer id, String title, float amount, String description) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("title", title);
        contentValues.put("amount", amount);
        contentValues.put("description", description);

        db.update("contacts", contentValues, "id = ? ", new String[]{Integer.toString(id)});
        return true;
    }

    public void deleteContact() {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete("contacts", null, null);
        db.close();
    }

    public void deleteSingleContact(String title){

        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(CONTACTS_TABLE_NAME, CONTACTS_COLUMN_TITLE + "=?", new String[]{title});
//KEY_NAME is a column name
    }

    public boolean checkForTables() {
        boolean hasRows = false;
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM " + CONTACTS_TABLE_NAME, null);
        cursor.moveToFirst();
        int count = cursor.getInt(0);
        if(count > 0)
            hasRows = true;
        db.close();
        return hasRows;
    }
    public ArrayList<ContactListItems> getAllContacts() {
        ArrayList<ContactListItems> contactList = new ArrayList<>();
        hp = new HashMap();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res = db.rawQuery("select * from contacts", null);
        res.moveToFirst();
        while (!res.isAfterLast()) {
                ContactListItems contactListItems = new ContactListItems();

                contactListItems.setTitle(res.getString(res
                        .getColumnIndex("title")));
                contactListItems.setAmount(res.getFloat(res
                        .getColumnIndex("amount")));
                contactListItems.setDescription(res.getString(res
                        .getColumnIndex("description")));
                contactList.add( contactListItems);
                res.moveToNext();
            }
        res.close();
        return contactList;
    }
    public int getTotalOfAmount(){
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c=db.rawQuery("SELECT SUM(amount) FROM " +CONTACTS_TABLE_NAME,null);
        c.moveToFirst();
        int i=c.getInt(0);
        c.close();
        return i;
    }
}

EDIT

obj.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                deleteDialog();
                return true;
            }
        });
    }

Logcat Error:

android.database.sqlite.SQLiteException: near "=": syntax error (code 1): , while compiling: DELETE FROM contacts WHERE title=
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663)
            at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)
            at com.softtech.stevekamau.buyathome.DBHelper.removeSingleContact(DBHelper.java:157)
            at com.softtech.stevekamau.buyathome.MyCart$6.onClick(MyCart.java:140)
            at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

解决方案

You can use SQL DELETE statement to choose which entry you want to delete. When using a string value as the selector, make sure you enclose the value in ''.

    /**
     * Remove a contact from database by title
     *
     * @param title to remove
     */
    public void removeSingleContact(String title) {
        //Open the database
        SQLiteDatabase database = this.getWritableDatabase();

        //Execute sql query to remove from database
        //NOTE: When removing by String in SQL, value must be enclosed with ''
        database.execSQL("DELETE FROM " + TABLE_NAME + " WHERE " + CONTACTS_COLUMN_TITLE + "= '" + title + "'");

        //Close the database
        database.close();
    }

Then whenever you want to remove an entry from the database use the following:

DBHelper dbHelper = new DBHelper(context);
dbHelper.removeSingleContact("CONTACT_TO_REMOVE_HERE");

UPDATE Assuming that your ListView dataset is an ArrayList containing ContactListItems, you can set an OnItemClickListener for your ListView and use it to get your selected title, and then remove it.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

        AlertDialog.Builder alertDialog = new AlertDialog.Builder(MyCart.this);
        alertDialog.setCancelable(false);
        alertDialog.setMessage("Delete item?");
        alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                String title;

                title = arrayList.get(position).getTitle();

                dbHelper.removeSingleContact(title);

                //Update your ArrayList
                arrayList = dbHelper.getAllContacts();

                //Notify your ListView adapter
                adapter.notifyDataSetChanged();

            }
        });
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        alertDialog.show();

    }

});

这篇关于如何删除的android源码单行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆