0

我试图将我的 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);
4

2 回答 2

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);
于 2012-09-11T17:20:25.667 回答
0

为什么不在插入之前计算行号并保护它?为什么要坚持使用 SQL 命令?顺便说一句,另一种解决方法是预先创建行的限制并使用更新,而不是插入。

于 2012-09-11T16:19:27.230 回答