0

SQLite データベースの行数を 1 に制限しようとしています。私はあらゆる場所で適切な解決策を探しましたが、どこにも行きませんでした。多くの提案 (制約、トリガーなど) を受け取りましたが、現在のスキル レベルで簡単に実装できるソリューションは実際には見つかりませんでした。トリガーを試すことにしましたが、コードを適切に記述する場所が見つかりません。私は構造を持っていますが、構文を適切にフォーマットする方法がわかりません。私のコードはもちろん動作していません(コンパイルエラー)。このコードを 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);
    }

主キーがテーブルに設定された DB:

  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

おそらく、テーブルを 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 に答える