我试图将SQLite Db中的行数限制为一行。我已经在每个地方搜索了一个适当的解决方案,但没有得到任何地方。我收到了很多建议(约束,触发器等等),但还没有真正找到一个易于用我目前的技能水平实现的解决方案。我已经决定尝试触发器,但无法找到正确编写代码的位置。我有结构但不知道如何正确格式化语法。我的代码在下面当然不起作用(编译错误)。任何指导如何正确编写Android代码的帮助将不胜感激。我已经遍布sqlite.org网站(http://www.sqlite.org/lang_createtrigger.html)
了 public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sqlDataStore = "create table if not exists " +
TABLE_NAME_CREDENTIALS + " ("+ BaseColumns._ID + " integer primary key " + " ON CONFLICT FAIL ,"
+ COLUMN_NAME_USERNAME + " TEXT NOT NULL " + " UNIQUE,"
+ COLUMN_NAME_PASSWORD + " TEXT NOT NULL " + " UNIQUE);";
db.execSQL(CREATE TRIGGER " row_limiter " + " BEFORE INSERT "
+ " ON "
+ " TABLE_NAME_CREDENTIALS "
+ " FOR EACH ROW WHEN "
+ ( SELECT + "_id" + FROM + " TABLE_NAME_CREDENTIALS ") > "1"
+ BEGIN
DELETE FROM + "TABLE_NAME_CREDENTIALS" + WHERE + "_id " > "1";
END
db.execSQL(sqlDataStore);
}
将主键设置为表的数据库:
String sqlDataStore = "create table if not exists " +
TABLE_NAME_CREDENTIALS + " ("+ BaseColumns._ID + " NOT NULL,"
+ COLUMN_NAME_USERNAME + " TEXT NOT NULL, "
+ COLUMN_NAME_PASSWORD + " TEXT NOT NULL, "
+ " PRIMARY KEY (username, passcode))";
插入:
contentValues.put(LoginDB.COLUMN_NAME_USERNAME, rUsername);
contentValues.put(LoginDB.COLUMN_NAME_PASSWORD, rPasscode);
答案 0 :(得分:1)
将表限制为一行的最简单方法可能是使用表中的主键,并确保在插入或更新时始终设置为常量值。不需要触发器或其他技巧。
CREATE TABLE `limited_table` (
`id` int(11) NOT NULL,
`value` text ,
PRIMARY KEY (`id`)
)
现在替换时,总是在SQL查询中使用常量
ContentValues args = new ContentValues();
args.put(KEY_ID, LIMITED_ID_CONST);
args.put(KEY_VALUE, value );
//Replace
db.replace(DATABASE_TABLE, null, args);
答案 1 :(得分:0)
为什么不在插入之前计算行号并保护它?为什么坚持使用SQL命令? 顺便说一句,另一种解决方法是预先创建行的限制并使用更新,而不是插入。