【问题标题】:Storing duplicate records in SQLite database table在 SQLite 数据库表中存储重复记录
【发布时间】:2015-05-26 11:32:52
【问题描述】:

我将数据存储到 SQLite 表中,如果数据已经存在,则更新它,我可以这样做,但是每当我更新现有记录时,它都会保存该记录的另一个副本...

DatabaseDataHelper.java:-

public class DatabaseDataHelper extends SQLiteOpenHelper {

    // Database Version
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "Data";
    // Table Name
    private static final String TABLE_MEMBER = "Data";

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

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE " + TABLE_MEMBER + 
                  "(Name VARCHAR(50) UNIQUE,"
                  " Title VARCHAR(50))");

        Log.d("CREATE TABLE","Create Table Successfully - classs");
    }

    public long InsertData(String strName, String strTitle) {

        try {
            SQLiteDatabase db;
            db = this.getWritableDatabase();

            ContentValues Val = new ContentValues();
            Val.put("Name", strName); 
            Val.put("Title", strTitle);

            long rows = db.insert(TABLE_MEMBER, null, Val);

            db.close();
            return rows;

        } catch (Exception e) {
            return -1;
        }
    }

    public long UpdateData(String strName, String strTitle) {

        try {
            SQLiteDatabase db;
            db = this.getWritableDatabase();

            ContentValues Val = new ContentValues();
            Val.put("Title", strTitle);

            long rows = db.update(TABLE_MEMBER, Val, "Name=?",
                    new String[] { String.valueOf(strName) });

            db.close();
            return rows;

        } catch (Exception e) {
            return -1;
        }   
    }

    public String[] SelectData(String strName) {

        try {
            String arrData[] = null;    

             SQLiteDatabase db;
             db = this.getReadableDatabase();

             Cursor cursor = db.query(TABLE_MEMBER, new String[] { "*" }, 
                     "Name=?",
                     new String[] { String.valueOf(strName) }, null, null, null, null);

                if(cursor != null) {
                    if (cursor.moveToFirst()) {
                        arrData = new String[cursor.getColumnCount()];
                        arrData[0] = cursor.getString(0);
                        arrData[1] = cursor.getString(1);
                    }
                }
                cursor.close();
                db.close();
                return arrData;
         } catch (Exception e) {
            return null;
         }
    }

    public boolean Exists(String strName) {
        SQLiteDatabase db;
        db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("select 1 from Data where Name= ?", new String[] { strImageName });
        boolean exists = (cursor.getCount() > 0);
        cursor.close();
        return exists;
    }

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

    public Cursor getAllData() {
         String selectQuery = "Select * from "+ TABLE_MEMBER; 
         SQLiteDatabase db = this.getReadableDatabase();
         Cursor cursor = db.rawQuery(selectQuery, null);
         return cursor;
    }

}

InsertDataActivity.java:-

public boolean saveData() {
    long storeData = databaseDataHelper.InsertData(txtName.getText().toString(), editTitle.getText().toString());

    if (storeData <=  0) {
    } else
        storeData = databaseDataHelper.UpdateData(txtName.getText().toString(),
            editTitle.getText().toString());
    return true;
}

【问题讨论】:

  • 在编辑之前,在数据库中查询是否存在相同的数据。
  • 你能显示你用来创建表的查询吗?
  • 您正在插入数据 无论如何(并且 storeData 是 1)。
  • 这里有什么问题?我已经尽力了
  • check this了吗?

标签: android sqlite


【解决方案1】:

InsertDataActivity 中插入和更新数据库中的数据,首先插入数据,然后更新数据。方法不对。

您应该先更新并检查受影响的行。如果您有 0 行受到影响,那么您只需要插入该行。

尝试关注:

public boolean saveData() {

    // This will Update record in the database if it is available and return row id of the updated database.
    long mNoRowsEffected = databaseDataHelper.UpdateData(txtName.getText().toString(), editTitle.getText().toString());

    // If we don't get any updated row id or if row id is null it mean the current record is not available in database 
    // so we need to insert this record to the database.
    if (mNoRowsEffected != null && mNoRowsEffected <= 0) {
        storeData = databaseDataHelper.InsertData(txtName.getText().toString(), editTitle.getText().toString());
    }

}

【讨论】:

  • 感谢我检查了您的回答是否有用,但使用 Abhishek 的回答我感觉很舒服
【解决方案2】:

编辑 - 正如 SilentKiller 所说,此方法会增加数据库开销,因为我们要进行一次额外调用。解决此问题的推荐方法是using constraints in the SQLite database,恕我直言,这更好。


InsertDataActivity 中,您正在调用InsertData() 而不检查条目是否已经存在。您应该检查数据是否存在,然后相应地调用InsertData()UpdateData()

这样的事情应该可以工作。

  public boolean saveData() {
    String[] data = databaseDataHelper.SelectData(txtName.getText().toString());

    if (data != null) {
        storeData = databaseDataHelper.UpdateData(txtName.getText().toString(),
                editTitle.getText().toString());
    } else {
        storeData = databaseDataHelper.InsertData(txtName.getText().toString(),
                editTitle.getText().toString());
    }
}

【讨论】:

  • 通过使用您的代码,它将增加对数据库的一项操作。
  • 你想让我在我的 sqlite 中做哪些改变?其次,为什么我要获取 .journal 文件(以及如何控制它的制作?)
  • 您可以对数据库中的ImageName 变量应用唯一约束。这将确保没有两行具有相同的ImageName。不知道 .journal 的东西,从来没有遇到过这样的文件。
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 2018-11-27
  • 2011-12-14
  • 2012-06-30
  • 2013-06-26
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
相关资源
最近更新 更多