Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite查询不断崩溃_Android_Sqlite_Android Sqlite - Fatal编程技术网

Android SQLite查询不断崩溃

Android SQLite查询不断崩溃,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我有一个查询,它根据应用程序中表单中传递的某些参数返回特定记录。这就是我遇到的问题: String[] args={"act_email,act_password"}; Cursor cursor= db.query(DB_TABLE_NAME,new String[]{"email","password"},"email"+" like" + " %?%"+"AND"+" password "+" like" + " %?%",new String[]{"act_email,act_passw

我有一个查询,它根据应用程序中表单中传递的某些参数返回特定记录。这就是我遇到的问题:

String[] args={"act_email,act_password"};
Cursor cursor= db.query(DB_TABLE_NAME,new String[]{"email","password"},"email"+" like" + " %?%"+"AND"+" password "+" like" + " %?%",new String[]{"act_email,act_password"},null,null, null);
以下是我在网上找到的一些代码:

 Cursor cursor= db.rawQuery("SELECT email,password  FROM users WHERE email LIKE '%' || ? || '%' and  password LIKE '%' || ? || '%'",args);

此代码不会导致任何问题,但它确实需要一些优化,主要是因为它总是返回空值。关于如何解决这个问题有什么建议吗?

为什么要连接这么多

在第一个where条件和and之间缺少空格

使用类似“%”的电子邮件和类似“%”的密码作为第三个参数


另外:您确定要接受作为数据库中存储的密码的一部分的每个密码输入吗?在这种情况下,e将是一个有效的输入,即使密码是JDSFSDAF2313

为什么要连接这么多

String[] args={"act_email,act_password"};
      Cursor cursor= db.query(DB_TABLE_NAME,new String[]{"email","password"},
"email like '%"+args[0]+"%' and password like '%"+args[1]+"%'",args,null,null, null);
在第一个where条件和and之间缺少空格

使用类似“%”的电子邮件和类似“%”的密码作为第三个参数


另外:您确定要接受作为数据库中存储的密码的一部分的每个密码输入吗?在这种情况下,e将是一个有效的输入,即使密码是JDSFSDAF2313

您的参数不正确,因为它缺少两个元素之间的引号。。。在花括号之间必须有两个单独的字符串。应改为:

String[] args={"act_email,act_password"};
      Cursor cursor= db.query(DB_TABLE_NAME,new String[]{"email","password"},
"email like '%"+args[0]+"%' and password like '%"+args[1]+"%'",args,null,null, null);
String[] args= {"act_email","act_password"};
编辑开始

其次,查询选择字符串中缺少“文本限定符”,对于文本字段,这些限定符的格式应为:

field=? [ AND field2=? ... AND fieldn=? ]
字段='?'

SQLite似乎可以自己处理引号,因此您只需以以下形式提供where子句:

field=? [ AND field2=? ... AND fieldn=? ]
然后在args数组中提供参数。Androids OpenDatabaseHelper类似乎根据类型自动处理文本限定符

编辑结束

请注意,以这种方式在Android上使用SQLite的参数化查询与查询字符串中的%wilcards不同。若要使用通配符,请将它们放在arg值中,并在执行过程中替换。因此,您的arg变为:

String[] args= {"%act_email%","%act_password%"};
或者,如果要在此处使用变量:

String[] args= {"%" + act_email + "%", "%" + act_password+ "%"};
因此,完整代码应该如下所示:

String[] fields = {"email","password"};
String[] args= {"%" + act_email + "%", "%" + act_password+ "%"};

//do not use like for usr & pwd
String where = "email like ? AND password like ?";

Cursor cursor= db.query(DB_TABLE_NAME, fields , where, args,null, null, null);
虽然我应该指出,在电子邮件和密码的情况下,你不应该像这样使用

将where子句更改为:

String where = "email=? AND password =?";//do not use like for usr & pwd

您的参数不正确,因为它缺少两个元素之间的引号。。。在花括号之间必须有两个单独的字符串。应改为:

String[] args= {"act_email","act_password"};
编辑开始

其次,查询选择字符串中缺少“文本限定符”,对于文本字段,这些限定符的格式应为:

field=? [ AND field2=? ... AND fieldn=? ]
字段='?'

SQLite似乎可以自己处理引号,因此您只需以以下形式提供where子句:

field=? [ AND field2=? ... AND fieldn=? ]
然后在args数组中提供参数。Androids OpenDatabaseHelper类似乎根据类型自动处理文本限定符

编辑结束

请注意,以这种方式在Android上使用SQLite的参数化查询与查询字符串中的%wilcards不同。若要使用通配符,请将它们放在arg值中,并在执行过程中替换。因此,您的arg变为:

String[] args= {"%act_email%","%act_password%"};
或者,如果要在此处使用变量:

String[] args= {"%" + act_email + "%", "%" + act_password+ "%"};
因此,完整代码应该如下所示:

String[] fields = {"email","password"};
String[] args= {"%" + act_email + "%", "%" + act_password+ "%"};

//do not use like for usr & pwd
String where = "email like ? AND password like ?";

Cursor cursor= db.query(DB_TABLE_NAME, fields , where, args,null, null, null);
虽然我应该指出,在电子邮件和密码的情况下,你不应该像这样使用

将where子句更改为:

String where = "email=? AND password =?";//do not use like for usr & pwd

你试过这样吗?我举了一个例子

  Cursor cursor1=db.rawQuery("SELECT taskid,taskname,taskdescription,tasktime,issync,userid,taskdate FROM task WHERE taskname like '%"+strTaskName+"%'", null);

你试过这样吗?我举了一个例子

  Cursor cursor1=db.rawQuery("SELECT taskid,taskname,taskdescription,tasktime,issync,userid,taskdate FROM task WHERE taskname like '%"+strTaskName+"%'", null);

好的,我在我自己的应用程序中尝试了这个,发现文本限定符似乎是自动处理的,我已经更新了我的答案以反映我的经验并指出一个有效的解决方案,请阅读我的答案并接受,如果这解决了你的问题。这将有助于其他人阅读此问题。好的,我实际上在自己的应用程序中尝试了这一点,发现文本限定符似乎是自动处理的,我已更新了我的答案以反映我的经验并指出一个可行的解决方案,请阅读我的答案,如果这解决了您的问题,请接受。这将有助于其他人阅读这个问题。