带有ContentProvider的插入中的CASE表达式

时间:2017-01-26 11:38:09

标签: android database sqlite android-contentprovider

我访问了sqlfiddle.com并进行了一些测试。

我想获得一个允许我插入行的SQL语句,并且有一个字段(下面称为 active ),其值取决于表是否为空。

我使用了以下架构:

CREATE TABLE kids (
        identifier    INTEGER PRIMARY KEY, 
        name          VARCHAR, 
        surname       VARCHAR, 
        active        INTEGER);


INSERT INTO 
    kids
VALUES 
    (1, "name1", "surname1", CASE WHEN EXISTS (SELECT * FROM kids) THEN 0 ELSE 1 END);  

INSERT INTO 
    kids
VALUES 
    (2, "name2", "surname2", CASE WHEN EXISTS (SELECT * FROM kids) THEN 0 ELSE 1 END);  

执行SELECT * FROM kids时,我得到以下结果:

+---+-------+----------+---+
| 1 | name1 | surname1 | 1 |
+---+-------+----------+---+
| 2 | name2 | surname2 | 0 |
+---+-------+----------+---+

这很完美。问题是,如何使用AndroidSQLiteContentProviders中执行此插入?两个插入(在ContentProvidersSQLite实例上都将ContentValues作为参数,我无法在那里添加子查询,它将被字面读取并且写的。

甚至有可能实现这一目标吗?如果您能想到任何其他方法,也欢迎。

谢谢。

2 个答案:

答案 0 :(得分:0)

ContentValues确保它的内容永远不会被解释为SQL,所以这是不可能的。

除非您确实需要向其他应用提供数据,否则请勿使用内容提供商。 (如果您需要向其他应用程序提供数据,那么允许它们执行任意SQL将是一个坏主意。)

答案 1 :(得分:0)

实现您的要求的另一种方法是在插入之前检查基础字段的值,然后在活动字段中插入整个数据和计算值