SQLite ROW限制

时间:2012-08-27 15:29:26

标签: android database sqlite database-design

  

可能重复:
  Limit an sqlite Table's Maximum Number of Rows

如何限制sqlite数据库中的行数?我想将我的db限制为10行,并在尝试超过该数量时给出一条消息。这将在创建数据库或查询db

时完成

创建:

String sqlDataStore = "create table if not exists " 
+ TABLE_NAME_INFOTABLE + " ("+ BaseColumns._ID + " integer primary key autoincrement," 

         + COLUMN_NAME_SITE + "text not null," 
         + COLUMN_NAME_ADDRESS + "text not null,"
         + COLUMN_NAME_USERNAME + "text not null,"
         + COLUMN_NAME_PASSWORD + "text not null)";

      db.execSQL(sqlDataStore); 

查询:

 Cursor cursor = database.query(databaseName.TABLE_NAME, null, null, null, null, null, databaseName.COLUMN_NAME, null);

2 个答案:

答案 0 :(得分:1)

此限制不能仅使用表定义。

方法包括:

  1. 使用INSERT触发器和RAISE(这需要带有触发器支持的SQLite版本),或者;

  2. 将INSERT访问权限放在DAL / BLL后面的数据库中,以防止添加超过N条记录。 UPDATE-instead-of-INSERT approach shown here是一种变体。

答案 1 :(得分:1)

您可以使用SQL DDL中的CHECK约束限制行数。您的应用程序必须捕获因尝试添加太多行而导致的错误。您的应用还必须捕获其他错误。磁盘已满,使用NULL等

关键点似乎是保证整数ID号实际上是一个整数。 SQLite的类型亲和性允许您将废话插入整数列。

sqlite> create table foo (n integer);
sqlite> insert into foo values ('wibble');
sqlite> select n from foo;
wibble

但是typeof()函数可以保护你免受废话。

typeof()函数是一个SQLite函数。它不是标准的SQL,因此如果移动到另一个dbms,则必须重写下面的CHECK约束。 (不太可能,因为你是为Android编程,但其他人看到这可能在不同的环境中工作。)

create table test_limit (
  n integer primary key
    check (
      (typeof(n)='integer') and
      (n >=1 and n <= 10)
  )
);

使用typeof(n)只允许插入整数。范围条件限制了可以插入的整数数。在3.7.9版中进行了简要测试。

sqlite> insert into test_limit values (1.13);
Error: datatype mismatch
sqlite> insert into test_limit values (-2);
Error: constraint failed
sqlite> insert into test_limit values ('wibble');
Error: datatype mismatch
sqlite> insert into test_limit values (1);
sqlite> insert into test_limit values (2);
sqlite> insert into test_limit values (17);
Error: constraint failed

...后来

如果您的目标可以表示为“将列'id'限制为1到10之间的整数”,那么这似乎是一个简单,可行的解决方案。我对你的代码采取了一些自由,所以我可以直接在SQLite中工作。您应该仔细查看非键列。由于你没有自然键(除了id号之外没有唯一的列集),你实际上没有太多的表。下面的我的SQL插入应该使 问题清楚,但这与将表限制为10行不同。

create table test_limit (
  id integer primary key autoincrement,
  site text not null,
  address text not null,
  username text not null,
  password text not null,
  check (
    typeof(id) = 'integer' and
    (id >= 1 and id <= 10)
  )
);

-- 10 inserts.    
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');
insert into test_limit (site, address, username, password)
values ('site', 'address', 'username', 'password');

尝试重复其中一个插入会导致Error: constraint failed。尝试在“id”列中插入除整数之外的任何内容都会失败,并显示Error: datatype mismatch