Android에서 SQLite에서 행 삭제


102

이것은 어리석은 질문 일 수 있지만 SQLite를 처음 사용하고 이것을 알아낼 수 없습니다. 나는 열이 한 테이블이 KEY_ROWID, KEY_NAME, KAY_LATITUDE,와 KEY_LONGITUDE. 사용자가 하나를 선택하고 삭제할 수 있기를 바랍니다. 누구든지 시작 방향을 알려줄 수 있습니까? 내 질문은 이름 만 주어진 행을 실제로 삭제하는 것입니다.

관련 코드 :

public class BeaconDatabase {

    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "beacon_name";
    public static final String KEY_LATITUDE = "beacon_lat";
    public static final String KEY_LONGITUDE = "beacon_lon";

    private static final String DATABASE_NAME ="BeaconDatabase";
    private static final String DATABASE_TABLE ="beaconTable";
    private static final int DATABASE_VERSION = 1;

    private DbHelper helper;
    private final Context context;
    private SQLiteDatabase db;

    public BeaconDatabase(Context context) {
        this.context = context;
    }

    public BeaconDatabase open() {
        helper = new DbHelper(this.context);
        db = helper.getWritableDatabase();
        return this;
    }

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

    public long createEntry(String name, Double lat, Double lon) {
        ContentValues cv = new ContentValues();
        cv.put(KEY_NAME, name);
        cv.put(KEY_LATITUDE, lat);
        cv.put(KEY_LONGITUDE, lon);
        return db.insert(DATABASE_TABLE, null, cv);
    }

    public void deleteEntry(long row) {

              // Deletes a row given its rowId, but I want to be able to pass
              // in the name of the KEY_NAME and have it delete that row.
              //db.delete(DATABASE_TABLE, KEY_ROWID + "=" + row, null);
    }

    public String getData() {
        String[] columns = { KEY_ROWID, KEY_NAME, KEY_LATITUDE, KEY_LONGITUDE };
        Cursor cursor = db.query(DATABASE_TABLE, columns, null, null, null, null, null);
        String result = "";

        int iRow = cursor.getColumnIndex(KEY_ROWID);
        int iName = cursor.getColumnIndex(KEY_NAME);
        int iLat = cursor.getColumnIndex(KEY_LATITUDE);
        int iLon = cursor.getColumnIndex(KEY_LONGITUDE);

        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            result += cursor.getString(iRow) + ": " + cursor.getString(iName) + " - " + cursor.getDouble(iLat) + " latitude " + cursor.getDouble(iLon) + " longitude\n";
        }

        return result;

    }

    private static class DbHelper extends SQLiteOpenHelper {

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

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " +  DATABASE_TABLE + " (" + 
                    KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    KEY_NAME + " TEXT NOT NULL, " +
                    KEY_LATITUDE + " DOUBLE, " +
                    KEY_LONGITUDE + " DOUBLE);"
            );
        }

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

@iDroid 대답으로 가십시오 ... 그것은 나를 위해 일할 것입니다. 감사합니다 iDroid.

답변:


183

다음과 같이 시도 할 수 있습니다.

 //---deletes a particular title---
public boolean deleteTitle(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "=" + name, null) > 0;
}

또는

public boolean deleteTitle(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "=?", new String[]{name}) > 0;
}

61
이 솔루션은 보안 누출 인 SQL 주입을 수행 할 수 있기 때문에 Vijay의 대답이 맞습니다. 예를 들어 : 이름 인수의 값을 사용하십시오. name = "TRUE; <any SQL command>;"=> '모든 SQL 명령'이 실행됩니다. 물론 해당 기능에 대한 GUI가 없다면 문제가되지 않습니다.
bdevay

@bdevay 내 대답은 쿼리로 수행 한 백그라운드 작업에 대한 것입니다. 따라서 UI와 관련이 없습니다. 정보를 동적으로 제공하기 만하면 보안이 필요하지 않습니다. vijay의 답변을 따르고 어떤 사람은 리버스 엔지니어링을 수행하면 데이터베이스 및 경쟁중인 필드에있는 테이블에 대한 정보를 얻을 수 있습니다. 내가 쿼리에서 직접하고 있으므로 부추를 가질 기회가 없습니다.
Shreyash Mahajan 2014

@iDroid Explorer : 물론 사용자 입력이나 다른 종류의 외부 쿼리 조작 가능성이 없다면 보안 위험은 다른 솔루션보다 높지 않습니다. ... 다음 코멘트에 계속
bdevay

1
...하지만 귀하의 의견의 리버스 엔지니어링 부분에 동의하지 않습니다. 어딘가에 그리고 어떻게 든 쿼리를 정의해야합니다. 즉, 리버스 엔지니어링이 항상 가능한 보안 누출 (솔루션의 경우에도), 특히 소스가 난독 화 되더라도 Java에서 가능하다는 것을 의미합니다. 해킹 시간을 더 늘릴 수 있습니다. 반면에 Google의 권장 사항은 선택 인수를 사용하는 것입니다. 다음 문서를 확인하십시오. link
bdevay

어떤 방법이나 변수에 정적 값을 제공하지 않는다는 개념을 의미합니다. 최대 동적이어야합니다. 따라서 정적 값을 제공하는 것보다 더 안전합니다. 어쨌든 사용자가 자신의 앱을 얼마나 안전하게 만들고 싶어하는지는 사용자에게 달려 있습니다.
Shreyash Mahajan 2014

157

당신의 솔루션을 얻을 수 있도록 그렇게 시도하십시오

String table = "beaconTable";
String whereClause = "_id=?";
String[] whereArgs = new String[] { String.valueOf(row) };
db.delete(table, whereClause, whereArgs);

58

whereargs도 사용하는 것이 좋습니다.

db.delete("tablename","id=? and name=?",new String[]{"1","jack"});

이것은 다음 명령을 사용하는 것과 같습니다.

delete from tablename where id='1' and name ='jack'

그리고 이러한 방식으로 삭제 기능을 사용하면 SQL 주입을 제거하기 때문에 좋습니다.


2
제공하는 솔루션에 대한 설명을 추가하여 답변을 더 자세히 설명해 주시겠습니까?
abarisone

1
나는 whereargs.
msysmilu 2015-06-03

@Enkahi 이것은 SQLite에서 준비된 문장과 같은가요? 나는 id=?이전에 PHP에서 이런 종류의 구문을 사용 했으며 그와 매우 비슷해 보입니다.
GeekWithGlasses

17

내가 귀하의 질문을 이해할 때까지 삭제할 행을 선택하기 위해 두 가지 조건을 입력하고 싶습니다.이를 위해 다음을 수행해야합니다.

public void deleteEntry(long row,String key_name) {

      db.delete(DATABASE_TABLE, KEY_ROWID + "=" + row + " and " + KEY_NAME + "=" + key_name, null);

      /*if you just have key_name to select a row,you can ignore passing rowid(here-row) and use:

      db.delete(DATABASE_TABLE, KEY_NAME + "=" + key_name, null);
      */  

}

13

이 코드 시도

public void deleteRow(String value)
{
SQLiteDatabase db = this.getWritableDatabase();       
db.execSQL("DELETE FROM " + TABLE_NAME+ " WHERE "+COlUMN_NAME+"='"+value+"'");
db.close();
}

삭제하고 싶을 때 어떻게 호출합니까? db.deleteRow ();
Phares

삭제할 매개 변수로 값을 전달하여 호출 할 수 있습니다. db.deleteRow ( "name");
Harman Khera

8

이 코드를 사용해보세요 ...

private static final String mname = "'USERNAME'";
public void deleteContact()
{
    db.delete(TABLE_CONTACTS, KEY_NAME + "=" + mname, null);
}


3

SQLiteDatabase 를 사용 하는 경우 삭제 방법이 있습니다.

삭제의 정의

int delete (String table, String whereClause, String[] whereArgs)

구현 예

이제 인수 를 이름으로 사용하여 delete 라는 메서드를 작성할 수 있습니다.

public void delete(String value) {
    db.delete(DATABASE_TABLE, KEY_NAME + "=?", new String[]{String.valueOf(value)});
}

모든 레코드삭제하려면 위의 메소드에 null을 전달하십시오.

public void delete() {
    db.delete(DATABASE_TABLE, null, null);
}

정보 출처


String 값이 외래 키와 함께 첨부되면 ??
거친 Bhavsar

2

여러분, 이것은 모든 테이블에 사용할 수있는 일반적인 방법입니다. 제 경우에는 완벽하게 작동했습니다.

public void deleteRowFromTable(String tableName, String columnName, String keyValue) {
    String whereClause = columnName + "=?";
    String[] whereArgs = new String[]{String.valueOf(keyValue)};
    yourDatabase.delete(tableName, whereClause, whereArgs);
}

String.ValueOf (keyValue) =>이 줄을 설명해 주시겠습니까?
Anis 2015

1
keyValue가 이미 문자열이므로 String.ValueOf (keyValue)가 필요하지 않습니다. 다른 경우에는이 whereArgs 배열을 사용하여 열 이름 값을 식별합니다.
Naveed Ahmad

2

테이블에서 행을 삭제하려면 행을 식별하는 선택 기준을 delete()메소드 에 제공해야합니다 . 메커니즘은 query()메서드에 대한 선택 인수와 동일하게 작동합니다 . 선택 사양을 선택 절 (where 절)과 선택 인수로 나눕니다.

    SQLiteDatabase db  = this.getWritableDatabase();
     // Define 'where' part of query.
    String selection = Contract.COLUMN_COMPANY_ID + " =?  and "
                       + Contract.CLOUMN_TYPE +" =? ";
   // Specify arguments in placeholder order.
    String[] selectionArgs = { cid,mode };
    // Issue SQL statement.
    int deletedRows = db.delete(Contract.TABLE_NAME, 
                       selection, selectionArgs);
    return deletedRows;// no.of rows deleted.

delete()메서드 의 반환 값 은 데이터베이스에서 삭제 된 행 수를 나타냅니다.


이 코드가 질문에 답할 수는 있지만이 코드가 질문에 대한 답변 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Thomas Flinkow

1

위의 솔루션이 작동하지 않으면 나를 위해 일했기 때문에 이것을 시도하십시오.

public boolean deleteRow(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "='" + name +"' ;", null) > 0;
}

1

잘 작동합니다!

public void deleteNewMelk(String melkCode) {
    getWritableDatabase().delete(your_table, your_column +"=?", new String[]{melkCode});
}

0

이거 한번 해봐:

public void deleteEntry(long rowId) {
    database.delete(DATABASE_TABLE , KEY_ROWID 
        + " = " + rowId, null);}

0
public boolean deleteRow(long l) {
    String where = "ID" + "=" + l;
    return db.delete(TABLE_COUNTRY, where, null) != 0;
}

0

내 작업 코드 스 니펫을 공유하여 이와 같이 할 수 있습니다.

쿼리가 다음과 같은지 확인하십시오.

tableName WHERE KEY__NAME = 'parameterToMatch'에서 삭제

public void removeSingleFeedback(InputFeedback itemToDelete) {
            //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_FEEDBACKS + " WHERE "
                    + KEY_CUSTMER_NAME + "= '" + itemToDelete.getStrCustName() + "'" +
                    " AND " + KEY_DESIGNATION + "= '" + itemToDelete.getStrCustDesignation() + "'" +
                    " AND " + KEY_EMAIL + "= '" + itemToDelete.getStrCustEmail() + "'" +
                    " AND " + KEY_CONTACT_NO + "= '" + itemToDelete.getStrCustContactNo() + "'" +
                    " AND " + KEY_MOBILE_NO + "= '" + itemToDelete.getStrCustMobile() + "'" +
                    " AND " + KEY_CLUSTER_NAME + "= '" + itemToDelete.getStrClusterName() + "'" +
                    " AND " + KEY_PRODUCT_NAME + "= '" + itemToDelete.getStrProductName() + "'" +
                    " AND " + KEY_INSTALL_VERSION + "= '" + itemToDelete.getStrInstalledVersion() + "'" +
                    " AND " + KEY_REQUIREMENTS + "= '" + itemToDelete.getStrRequirements() + "'" +
                    " AND " + KEY_CHALLENGES + "= '" + itemToDelete.getStrChallenges() + "'" +
                    " AND " + KEY_EXPANSION + "= '" + itemToDelete.getStrFutureExpansion() + "'" +
                    " AND " + KEY_COMMENTS + "= '" + itemToDelete.getStrComments() + "'"
            );

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

0

아래 코드를 시도하십시오-

mSQLiteDatabase = getWritableDatabase();//To delete , database should be writable.
int rowDeleted = mSQLiteDatabase.delete(TABLE_NAME,id + " =?",
                    new String[] {String.valueOf(id)});
mSQLiteDatabase.close();//This is very important once database operation is done.
if(rowDeleted != 0){
    //delete success.
} else {
    //delete failed.
}

0

나를 위해 일한 유일한 방법은

fun removeCart(mCart: Cart) {
    val db = dbHelper.writableDatabase
    val deleteLineWithThisValue = mCart.f
    db.delete(cons.tableNames[3], Cart.KEY_f + "  LIKE  '%" + deleteLineWithThisValue + "%' ", null)
}


class Cart {
    var a: String? = null
    var b: String? = null
    var c: String? = null
    var d: String? = null
    var e: Int? = null
    var f: String? = null

companion object {
    // Labels Table Columns names
    const val rowIdKey = "_id"
    const val idKey = "id"
    const val KEY_a = "a"
    const val KEY_b = "b"
    const val KEY_c = "c"
    const val KEY_d = "d"
    const val KEY_e = "e"
    const val KEY_f = "f"
   }
}

object cons {
    val tableNames = arrayOf(
            /*0*/ "shoes",
            /*1*/ "hats",
            /*2*/ "shirt",
            /*3*/ "car"
         )
 }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.