行的连续递增

Continuous Incrementing of Rows

我正在尝试在 android 中的 SQLite 中构建一个 Table 按钮,每次我打开我的应用程序并查看 DBBrowser 时,行数不断增加,总行数应该是47

//Menu.class
conn =  new SQLiteDatabase(this); 
        if(conn.setInitializeTableButtons()){
            Toast.makeText(getApplicationContext(), "DB READY", Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(getApplicationContext(), "DB FAILED", Toast.LENGTH_SHORT).show();
        }

//SQLiteDatabase.class
   public boolean setInitializeTableButtons() {
        android.database.sqlite.SQLiteDatabase conn = this.getWritableDatabase();
        contentValues = new ContentValues();
        for (int i = 0; i < buttonNames.length; i++) {
            contentValues.put(BUTTON_NAME, buttonNames[i]);
            if (i == 0) {
                contentValues.put(IS_UNLOCK, 1);
            }
            else{
                contentValues.put(IS_UNLOCK, 0);
            }
            conn.insert(TABLE_BUTTONS, null, contentValues);
        }
        return true;
    }

问题

数据库持久存在,即它被保存为文件,添加(插入)的任何数据将永远保留,除非被删除。

所以你正在打开一个数据库,如果它不存在就会创建它,然后你添加一些数据(47 行)。

下一次应用程序是 运行,您打开它并添加另外 47 行等等。

如何修复

您需要执行以下操作之一:-

  • 在添加行之前删除所有现有行

    • 这是相对昂贵的资源。
  • 检查数据是否已经存在,不添加任何行

    • 这不是随table(可能有点复杂)如果要添加的数据增加。
  • 有一个模式,以及不允许重复数据的代码。

    • 这可能是 better/simplest 选项。

建议修复 所以假设你的 table 是这样的:-

CREATE TABLE your_table (btnIds INTEGER PRIMARY KEY, btnNames TEXT, btnIsUnlock INTEGER);

然后您可以将 btnNames 列设置为 UNIQUE,这意味着按钮名称不能重复。例如

CREATE TABLE your_table (btnIds INTEGER PRIMARY KEY, btnNames TEXT UNIQUE, btnIsUnlock INTEGER)

通常会发生失败(冲突),但 SQLiteDatabase insert 方法实际上是 INSERT OR IGNORE(即它会捕获并忽略冲突)。

因此编码 UNIQUE 将允许重复插入到 运行 而无需添加重复项但添加任何新的(根据名称)。

建议的改进

您可能希望考虑使用以下方式将循环置于事务中:-

//SQLiteDatabase.class
public boolean setInitializeTableButtons() {
    android.database.sqlite.SQLiteDatabase conn = this.getWritableDatabase();
    conn.beginTransaction();
    contentValues = new ContentValues();
    for (int i = 0; i < buttonNames.length; i++) {
        contentValues.put(BUTTON_NAME, buttonNames[i]);
        if (i == 0) {
            contentValues.put(IS_UNLOCK, 1);
        }
        else{
            contentValues.put(IS_UNLOCK, 0);
        }
        conn.insert(TABLE_BUTTONS, null, contentValues);
    }
    conn.setTransactionSuccessful();
    conn.endTransaction();
    return true;
 }

不是写入磁盘 47 次(每次插入磁盘写入),所有插入都将完成,然后写入磁盘(因此只有 1 次磁盘写入)。写入磁盘相对耗费资源。