如何限制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);
答案 0 :(得分:1)
此限制不能仅使用表定义。
方法包括:
使用INSERT触发器和RAISE(这需要带有触发器支持的SQLite版本),或者;
将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
。