Sqlite3 - 将参数传递给预处理语句

时间:2012-05-31 14:24:54

标签: sqlite

我已准备好声明,我想从命令行工具测试,而不是"手动"传递参数。

示例sql:

 SELECT * FROM TABLE WHERE X = ? AND Y = ?

是否有一种传递参数的方法,以便可以使用给定的值执行SQL,例如:SQL bind(a,b,c)?

谢谢,

1 个答案:

答案 0 :(得分:1)

编辑:不知道你在哪里运行,但这里是一个针对那些感兴趣的Android解决方案:

如果我正确理解您的问题,您希望将值从命令行传递到SQL语句以测试结果。这有点工作,但可行:

adb中有一些功能可以将Intent发送到特定的Activity,其中可能包含Extras。如果您将始终拥有固定数量的参数,则可以使用包含Extras的Intent对Activity进行编程,并从命令行传递它。输入命令(提示音乐):adb shell am start。有关此命令的更多信息,请参阅documentationthis tutorial

以下是一些示例代码:

public class MainActivity extends Activity {

    private final String EXTRA1 = "com.example.sample.EXTRA1";
    private final String EXTRA2 = "com.example.sample.EXTRA2";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        String qparam1 = null;
        String qparam2 = null;
        Intent calledBy = getIntent();

        if (calledBy.hasExtra(EXTRA1)) qparam1 = calledBy.getStringExtra(EXTRA1);
        if (calledBy.hasExtra(EXTRA2)) qparam2 = calledBy.getStringExtra(EXTRA2);
        ...

此时您现在有了几个选项,因为您有参数,您可以运行普通getContentResolver().query(),创建选择并将参数作为选择参数传递:

String selection = "WHERE x=? AND Y=?";
String[] args = new String[]{qparam1, qparam2};
getContentResolver().query(uri, projection, selection, args, null);

(如果你有intlong args,请注意这样做。请参阅this article

您还可以选择创建预编译语句。一些预编译的语句只会给你一个1x1的结果,所以它可能是有限的,这取决于你期望的输出。

SQLiteDatabase db; // assume already initialized
SQLiteStatement statement = db.compileStatement("SELECT * FROM table WHERE x=? AND y=?");

statement.bindAllArgsAsStrings(new String[]{qparam1, qparam2});
// now run some kind of execute command, as per SQLiteStatement documentation

SQLiteStatement documentation

呼。好的,最后,使用adb shell am start发送数据。根据文档,您可以执行以下操作

> adb shell am start -n com.example.sample/.MainActivity -e com.example.sample.EXTRA1 first -e com.example.sample.EXTRA2 second

如果一切按计划进行,它应该启动您的活动,将附加内容传递到您的查询中,然后运行它。然后根据你的输出,剩下的就是找出输出的位置,可能是一个你以后可以检索的文件。

祝你好运!