sqlite数据库会覆盖现有记录,而不是在物理设备中插入新记录

时间:2018-10-28 03:50:19

标签: android sqlite android-sqlite

我正面临着无法将新记录插入表中,而是覆盖了表中的第一条记录的挑战。

这发生在物理设备中,因为它在仿真器中工作正常。

以下是用于插入记录的代码:

Date date = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss", Locale.getDefault());
            String strDate = formatter.format(date);

            //SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING);

            SQLiteDatabase db = this.getWritableDatabase();
            /*ContentValues values = new ContentValues();
            //values.put("UserId",1);
            values.put("NoQPassed", scoreValues.get("NoPassed"));
            values.put("NoQFailed", scoreValues.get("NoFailed"));
            values.put("NoQSkipped", scoreValues.get("NoSkipped"));
            values.put("SubjectName", scoreValues.get("strSubjectName"));
            values.put("CompletedDateTime", strDate);
            intRetVal= db.insert(score_Table_Name, null, values);*/

            String strQuery="insert into "+score_Table_Name+" values ('"+strDate+"','"+scoreValues.get("NoPassed")+
                    "','"+scoreValues.get("NoFailed")+"','"+scoreValues.get("NoSkipped")+"','"+scoreValues.get("strSubjectName")+"')";
            db.execSQL(strQuery);
            db.close();

尝试使用 db.insert db.executeSQL 进行插入,但没有帮助。有人可以帮我解决我的问题吗?

我没有添加任何主键或自动增量键来确保冲突不是由于该列。我们是否总是需要主键才能插入新记录?

1 个答案:

答案 0 :(得分:0)

您可以使用下面的getCount()方法对出现的次数进行计数。 if getCount(name)== 0然后插入。否则不插入并尝试登录。

public int getCount(String name) {
    Cursor c = null;
    try {
        db = Dbhelper.getReadableDatabase();
        String query = "select count(*) from TableName where name = ?";
        c = db.rawQuery(query, new String[] {name});
        if (c.moveToFirst()) {
            return c.getInt(0);
        }
        return 0;
    }
    finally {
        if (c != null) {
            c.close();
        }
        if (db != null) {
            db.close();
        }
    }
}

但是,如果您说要覆盖它,则此逻辑可能无效。我认为在该Android sqlite中没有替代方法。请检查在插入新记录之前您可能会在任何地方删除数据库。似乎是覆盖数据