Java 如何获取表中包含一个或多个变量的行
我有一个列Id、名称和描述的表 我有字符串:Java 如何获取表中包含一个或多个变量的行,java,android,sqlite,Java,Android,Sqlite,我有一个列Id、名称和描述的表 我有字符串: String values = "banana, apple" 现在我想获取所有行,其中列Desctiption同时包含“apple”和“banana”单词 我使用了以下代码: public List<Flavours> getNeedFlavours(String text) { List<Flavours> flavoursList = new ArrayList<Flavours>();
String values = "banana, apple"
现在我想获取所有行,其中列Desctiption同时包含“apple”和“banana”单词
我使用了以下代码:
public List<Flavours> getNeedFlavours(String text) {
List<Flavours> flavoursList = new ArrayList<Flavours>();
// Select All Query
// String selectQuery = "SELECT " + KEY_DATE + " FROM " + TABLE_TV_PROGRAMM;
String table = TABLE_FLAVOURS;
String where = KEY_DESCRIPTION + " = ?" ;
String[] args = text.split(",");
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.query(table, null, where, args, null, null, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Flavours flavours= new Flavours();
flavours.setID(Integer.parseInt(cursor.getString(0)));
flavours.setName(cursor.getString(1));
flavours.setDescription(cursor.getString(2));
// Adding contact to list
flavoursList.add(flavours);
} while (cursor.moveToNext());
}
// return channels list
return flavoursList;
}
公共列表GetNeedFlavors(字符串文本){
List-flavoursList=new-ArrayList();
//选择所有查询
//String selectQuery=“选择”+表电视节目中的“+键日期+”;
字符串表=表的味道;
字符串,其中=关键字描述+“=?”;
字符串[]args=text.split(“,”);
SQLiteDatabase db=this.getWritableDatabase();
Cursor Cursor=db.query(表,null,其中,args,null,null,null);
//循环遍历所有行并添加到列表
if(cursor.moveToFirst()){
做{
口味=新口味();
setID(Integer.parseInt(cursor.getString(0));
setName(cursor.getString(1));
setDescription(cursor.getString(2));
//将联系人添加到列表中
调味品列表。添加(调味品);
}while(cursor.moveToNext());
}
//返回频道列表
返回风味列表;
}
但我得到了一个错误:
android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException: bind or column index out of range: handle 0x21443d8
at android.database.sqlite.SQLiteProgram.native_bind_string(Native Method)
at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:247)
at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:299)
at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:401)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:55)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:58)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1653)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1538)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1494)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1574)
at uz.ugadaykin.hookah.db.DatabaseHandler.getNeedFlavours(DatabaseHandler.java:175)
at uz.ugadaykin.hookah.fragment.FlavoursFragment.makeListView(FlavoursFragment.java:87)
at uz.ugadaykin.hookah.fragment.FlavoursFragment$1.onClick(FlavoursFragment.java:69)
at android.view.View.performClick(View.java:3549)
at android.view.View$PerformClick.run(View.java:14400)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4944)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException:绑定或列索引超出范围:句柄0x21443d8
位于android.database.sqlite.SQLiteProgram.native\u bind\u string(本机方法)
位于android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:247)
位于android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:299)
位于android.database.sqlite.SQLiteProgram.bindallargsassstrings(SQLiteProgram.java:401)
位于android.database.sqlite.SQLiteQuery(SQLiteQuery.java:55)
位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:58)
位于android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1653)
位于android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1538)
位于android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1494)
位于android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1574)
在uz.ugadaykin.hookah.db.DatabaseHandler.getNeedFlavours(DatabaseHandler.java:175)
在uz.ugadaykin.hookah.fragment.FlavoursFragment.makeListView(FlavoursFragment.java:87)
在uz.ugadaykin.hookah.fragment.FlavoursFragment$1.onClick(FlavoursFragment.java:69)
在android.view.view.performClick上(view.java:3549)
在android.view.view$PerformClick.run(view.java:14400)
位于android.os.Handler.handleCallback(Handler.java:605)
位于android.os.Handler.dispatchMessage(Handler.java:92)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:4944)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
在dalvik.system.NativeStart.main(本机方法)
如何解决此问题?您在
args
中传递了多个值(根据您的示例,我猜是2个),但对于selectionArgs
,只有一个占位符=?
您的意思可能是
KEY\u DESCRIPTION+“IN(?)
将text
传递为selectionArgs如果您事先不知道有多少个值,您可以在调用split()
后循环,只需添加所需的占位符即可
String table = TABLE_FLAVOURS;
StringBuilder where = new StringBuilder() ;
String[] args = text.split(",");
//construct args with proper formatting
String[] likeArgs = new String[args.length];
for (int i = 0; i < args.length; i++){
//construct LIKE args
likeArgs[i] = "%" + args[i] + "%";
//construct where clause
if (i == 0){
where.append(KEY_DESCRIPTION + " LIKE ?");
}
else{
where.append(" OR " + KEY_DESCRIPTION + " LIKE ?");
}
}
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.query(table, null, where.toString(), likeArgs, null, null, null);
String table=table\u flavors;
StringBuilder,其中=新建StringBuilder();
字符串[]args=text.split(“,”);
//使用正确的格式构造参数
String[]likeArgs=新字符串[args.length];
对于(int i=0;i
您给了两个值,其中rgs
只有一个?
占位符。如果在args
数组中有两个元素,请执行此操作:String其中=KEY\u DESCRIPTION+“=”或“+KEY\u DESCRIPTION+”=?”问题是我不知道会有多少个值。也可以只有“苹果”或三个或四个值(“苹果、香蕉、樱桃”)是的,没错。我已经改变了它,但仍然不起作用。但是,没有任何错误字符串:“香蕉”,“苹果”,否则他们是考虑列。我认为这是我需要的,但是Kig描述必须包含(不相等)这些词。我如何处理这个问题?您可以像
一样使用,但必须在args
数组中的每个项目周围添加“%”。看看这个答案: