我有一个小型数据库应用程序。它要求用户输入代码1A1,例如搜索Db。
如果我对sql命令进行硬编码,它会找到该行。
Cursor c=db.rawQuery("SELECT * from emdcode WHERE code = '1A1'",null);
在我的布局上,我有一个用户输入的文本框
<EditText
android:id="@+id/codelookup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView1"
android:layout_alignBottom="@+id/textView1"
android:layout_alignParentRight="true"
android:layout_toRightOf="@+id/button3"
android:ems="10" >
<requestFocus />
</EditText>
我的问题&gt;如何编写SQL来搜索用户输入?
我在Java中完成了这个
private void SrchCodeActionPerformed(java.awt.event.ActionEvent evt)
{
String sql = "SELECT * FROM emdcodes WHERE Codes like ?";
try
{
ps = conn.prepareStatement(sql);
ps.setString(1, EMDCODELOOKUP.getText() + "%");
rs = ps.executeQuery();
ResultsTable.setModel(DbUtils.resultSetToTableModel(rs));
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, e);
}
}
所以我认为SQLite类似
我试过了
Cursor c=db.rawQuery("SELECT * from emdcode WHERE code = codelookup",null);
Cursor c=db.rawQuery("SELECT * from emdcode WHERE code = ?",null);
任何建议或指导都会很棒。谢谢
更新
当使用Cursor c = db.rawQuery(&#34; SELECT * from emdcode WHERE code =?&#34;,new String [] {&#34; codelookup&#34;}); 我得到一个null结果集。这是logcat文件:
07-31 00:10:34.735: E/Trace(1765): error opening trace file: No such file or directory (2)
07-31 00:10:38.645:E / AndroidRuntime(1765):致命异常:主要 07-31 00:10:38.645:E / AndroidRuntime(1765):java.lang.IllegalStateException:无法执行活动的方法 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.view.View $ 1.onClick(View.java:3599) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.view.View.performClick(View.java:4204) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.view.View $ PerformClick.run(View.java:17355) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.os.Handler.handleCallback(Handler.java:725) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.os.Handler.dispatchMessage(Handler.java:92) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.os.Looper.loop(Looper.java:137) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.app.ActivityThread.main(ActivityThread.java:5041) 07-31 00:10:38.645:E / AndroidRuntime(1765):at java.lang.reflect.Method.invokeNative(Native Method) 07-31 00:10:38.645:E / AndroidRuntime(1765):at java.lang.reflect.Method.invoke(Method.java:511) 07-31 00:10:38.645:E / AndroidRuntime(1765):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 07-31 00:10:38.645:E / AndroidRuntime(1765):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 07-31 00:10:38.645:E / AndroidRuntime(1765):at dalvik.system.NativeStart.main(Native Method) 07-31 00:10:38.645:E / AndroidRuntime(1765):引起:java.lang.reflect.InvocationTargetException 07-31 00:10:38.645:E / AndroidRuntime(1765):at java.lang.reflect.Method.invokeNative(Native Method) 07-31 00:10:38.645:E / AndroidRuntime(1765):at java.lang.reflect.Method.invoke(Method.java:511) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.view.View $ 1.onClick(View.java:3594) 07-31 00:10:38.645:E / AndroidRuntime(1765):... 11更多 07-31 00:10:38.645:E / AndroidRuntime(1765):引起:java.lang.IllegalArgumentException:索引1处的绑定值为null 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 07-31 00:10:38.645:E / AndroidRuntime(1765):在android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 07-31 00:10:38.645:E / AndroidRuntime(1765):at com.example.studentdatabase.MainActivity.showdata(MainActivity.java:47) 07-31 00:10:38.645:E / AndroidRuntime(1765):......还有14个 07-31 00:11:55.095:E / Trace(1839):错误打开跟踪文件:没有这样的文件或目录(2) 07-31 00:20:08.084:E / Trace(2020):错误打开跟踪文件:没有这样的文件或目录(2) 07-31 00:20:16.915:E / AndroidRuntime(2020):致命异常:主要 07-31 00:20:16.915:E / AndroidRuntime(2020):java.lang.IllegalStateException:无法执行活动的方法 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.view.View $ 1.onClick(View.java:3599) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.view.View.performClick(View.java:4204) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.view.View $ PerformClick.run(View.java:17355) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.os.Handler.handleCallback(Handler.java:725) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.os.Handler.dispatchMessage(Handler.java:92) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.os.Looper.loop(Looper.java:137) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.app.ActivityThread.main(ActivityThread.java:5041) 07-31 00:20:16.915:E / AndroidRuntime(2020):at java.lang.reflect.Method.invokeNative(Native Method) 07-31 00:20:16.915:E / AndroidRuntime(2020):at java.lang.reflect.Method.invoke(Method.java:511) 07-31 00:20:16.915:E / AndroidRuntime(2020):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 07-31 00:20:16.915:E / AndroidRuntime(2020):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 07-31 00:20:16.915:E / AndroidRuntime(2020):at dalvik.system.NativeStart.main(Native Method) 07-31 00:20:16.915:E / AndroidRuntime(2020):引起:java.lang.reflect.InvocationTargetException 07-31 00:20:16.915:E / AndroidRuntime(2020):at java.lang.reflect.Method.invokeNative(Native Method) 07-31 00:20:16.915:E / AndroidRuntime(2020):at java.lang.reflect.Method.invoke(Method.java:511) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.view.View $ 1.onClick(View.java:3594) 07-31 00:20:16.915:E / AndroidRuntime(2020):......还有11个 07-31 00:20:16.915:E / AndroidRuntime(2020):引起:java.lang.IllegalArgumentException:索引1处的绑定值为null 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 07-31 00:20:16.915:E / AndroidRuntime(2020):在android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 07-31 00:20:16.915:E / AndroidRuntime(2020):at com.example.studentdatabase.MainActivity.showdata(MainActivity.java:47) 07-31 00:20:16.915:E / AndroidRuntime(2020):... 14更多 07-31 00:32:07.675:E / Trace(2296):错误打开跟踪文件:没有这样的文件或目录(2) 07-31 00:33:22.405:E / Trace(2377):错误打开跟踪文件:没有这样的文件或目录(2)
答案 0 :(得分:1)
尝试。
Cursor c=db.rawQuery("SELECT * from emdcode WHERE code = ?", new String[]{theStringYouWantToSearchForHere});
当你使用?时几乎已经拥有它了。第二个参数应该是where参数的字符串数组。
如果你看一下logcat,
Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
表示要解析到数组中的字符串为null,导致崩溃
如果你把
String search = "1A1";
Cursor c=db.rawQuery("SELECT * from emdcode WHERE code = ?", new String[]{search});
这应该有效。
这意味着您在调用此方法之前不会初始化搜索值(最有可能)。
编辑:对于编辑文字
您想获取编辑文本值。 像
这样的东西EditText codelookup = (EditText) ActivityName.this.findViewById(R.id.codelookup);
String search = codelookup.getText().toString();
请注意,我假设您在findViewById的活动中。如果你打算使用这个很多,我建议你把editTextFor codelookup作为一个类变量。你只需要找到它一次(注意你需要在setContentView()之后有findViewById。)
答案 1 :(得分:1)
你可以试试这个:
public Cursor GetData(String Code) throws Exception
{
Cursor cursor;
cursor = this.db.query("emdcode",null, "code = "+Code, null, null, null, null,null );
return cursor;
}
或
public Cursor GetData(String Code) throws Exception
{
Cursor cursor;
cursor = this.db.query("emdcode",null, "code = ?", new String[]{code}, null, null, null,null );
return cursor;
}