行的连续递增
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;
}
- https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#beginTransaction()
- https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#setTransactionSuccessful()
- https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#endTransaction()
不是写入磁盘 47 次(每次插入磁盘写入),所有插入都将完成,然后写入磁盘(因此只有 1 次磁盘写入)。写入磁盘相对耗费资源。
我正在尝试在 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;
}
- https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#beginTransaction()
- https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#setTransactionSuccessful()
- https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#endTransaction()
不是写入磁盘 47 次(每次插入磁盘写入),所有插入都将完成,然后写入磁盘(因此只有 1 次磁盘写入)。写入磁盘相对耗费资源。