1

可能重复:
限制一个 sqlite 表的最大行数

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

创建:

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);
4

2 回答 2

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)
  )
);

Usingtypeof(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.

于 2012-08-27T19:14:48.700 回答
1

此限制不能仅通过表定义来施加。

方法包括:

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

  2. 将对数据库的 INSERT 访问置于 DAL/BLL 之后,以防止添加超过 N 条记录。此处显示的UPDATE-instead-of-INSERT 方法是一种变体。

于 2012-08-27T15:41:06.410 回答