0

我创建了一个将数据插入到 sq-lite 的应用程序。我想如果我再次输入相同的数据,它应该给 e toast 按摩,然后它只更新该数据而不重新插入。我应该怎么办.....

现在数据被重新插入SQLiteOpenHelper的方法代码.....

public void insertdata(String name,String ph,String area){
    ContentValues cv=new ContentValues();
    cv.put("name", name);
    cv.put("phone", ph);
    cv.put("area", area);
    sd=this.getWritableDatabase();
    sd.insert("location", null, cv);
    sd.close();

Activity类中的方法使用......

public void onClick(View v) {
                // TODO Auto-generated method stub
                help=new MyHelper(getApplicationContext());
                help.getWritableDatabase();
                String myname=name.getText().toString();
                String call=phone.getText().toString();
                String myarea=area.getText().toString().trim();
                help.insertdata(myname, call, myarea);

                Toast.makeText(getApplicationContext(), "data saved ", Toast.LENGTH_SHORT).show();

            }
        });
4

2 回答 2

0

正在重新插入数据,因为您的方法永远不会检查它是否已存在于数据库中。您需要为一些独特的组合添加查询 - 可能是姓名和电话号码。如果该查询返回结果,您可以提示用户输入数据。

String query = "SELECT * FROM " + TABLE_NAME + " WHERE name = " + name;
SQLiteDatabase db = this.getReadableDatabase(); 
Cursor cursor = db.rawQuery(query, null);
if(cursor != null && cursor.moveToFirst()){ //if cursor has entry then don't reinsert 
    //prompt user with dialog
}  else {
    //insert data
}

您也不能Toast为此使用 a 。你想要的是一个Dialog. 如果数据存在,您可以Dialog向用户显示自定义项,您可以使用该自定义项允许他们 (1) 输入新数据 (2) 编辑现有数据 (3) 选择重新插入他们发布的数据。AToast只会向他们显示一条消息,例如“重新插入数据”。听起来这不是您想要实现的功能。

要更新数据库,您可以根据要更改的字段使用更新语句。

String query = "UPDATE " + TABLE_NAME + " SET";
if(!name.isEmpty(){
    query += " name = " + name;
}

if(!phone.isEmpty(){
    query += " phone = " + phone;
}

SQLiteDatabase db = this.getWritableDatabase(); 
db.execSQL(CREATE_CONTACTS_TABLE)

我将 if 语句放入以检查哪些字段正在更改,并相应地将它们添加到查询中。在替代方案中,您可以使用类似这样的东西

public int updateContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, contact.getName()); 
    values.put(KEY_PH_NO, contact.getPhoneNumber()); 

    // updating row 
    return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", 
            new String[] { String.valueOf(contact.getID()) }); 
}

虽然我已经对其进行了修改以适合您的示例,但您可以看到基本方法。在这里,您可以使用条件来检查是否提供了值,如果是,则将它们添加到 ContentVlues 列表中,该列表将在数据库中更新它们。

于 2013-07-29T12:56:35.850 回答
0

你可以尝试这样的事情:

 ContentValues values=new ContentValues();
    cv.put("name", name);
    cv.put("phone", ph);
    cv.put("area", area);

if (db == null) {
db = getWritableDatabase();
    }
if (isNameExists(name)) {  //check if name exits 
        id = db.update(TABLE_NAME, values, name + " = ?",
                new String[] {name});
    } else {
        id = db.insert(TABLE_NAME, null, values);
    }

    public boolean isNameExists(String name) {
    Cursor cursor = null;
    boolean result = false;
    try {
        String[] args = { "" + name };
        StringBuffer sbQuery = new StringBuffer("SELECT * from ").append(
                TABLE_NAME).append(" where name=?");
        cursor = getReadableDatabase().rawQuery(sbQuery.toString(), args);
        if (cursor != null && cursor.moveToFirst()) {
            result = true;
        }
    } catch (Exception e) {
        Log.e("AppoitnmentDBhelper", e.toString());
    }
    return result;
于 2013-07-29T12:49:14.170 回答