Android:SQLite搜索

时间:2012-10-17 10:10:35

标签: android sqlite android-sqlite

我正在开发一个简单的应用程序,它插入数据库并在插入的数据中搜索

我创建了数据库,我可以看到插入的所有行...我想使用Name列搜索行

我遇到错误,我不知道错误行在哪里

下面是我创建数据库的代码。

sampleDB =  this.openOrCreateDatabase(SAMPLE_DB_NAME, MODE_PRIVATE, null);

sampleDB.execSQL("CREATE TABLE IF NOT EXISTS "+SAMPLE_TABLE_NAME +
                    " (Id INT(50), Name VARCHAR," +
                    " Price INT(50), Qty INT(50), Discount INT(50), Category INT(10));");

这是在数据库中搜索的代码

Button saveButton = (Button) findViewById(R.id.search_button);

        saveButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {

                String searchStr = search.getText().toString();

                Cursor c = sampleDB.rawQuery("SELECT Name, Price FROM "+SAMPLE_TABLE_NAME+" WHERE Name like '"+searchStr+"'", null);

                if (c != null ) { 
                    if  (c.moveToFirst()) {
                        do {
                            String name = c.getString(c.getColumnIndex("Name"));
                            int cat = c.getInt(c.getColumnIndex("Category"));
                            results.add("" + name + ",Age: " + cat);
                            Log.v("Fname", name);
                            Log.v("Cat", cat+"");
                        }while (c.moveToNext());
                    }
                }

            }
        });

知道searchStr具有我想在数据库中搜索的名称

这是我遇到的错误

Bad request for field slot 0,-1. numRows = 18, numColumns = 2
FATAL EXCEPTION: main
java.lang.IllegalStateException: get field slot from row 0 col -1 failed

有什么帮助吗?

4 个答案:

答案 0 :(得分:3)

您只在查询中选择nameprice

Cursor c = sampleDB.rawQuery("SELECT Name, Price FROM "+SAMPLE_TABLE_NAME+" WHERE Name like '"+searchStr+"'", null);

然后您尝试访问category ..

int cat = c.getInt(c.getColumnIndex("Category"));

因此,您应该在select语句中添加类别:

Cursor c = sampleDB.rawQuery("SELECT Name, Price, Category FROM "+SAMPLE_TABLE_NAME+" WHERE Name like '"+searchStr+"'", null);

答案 1 :(得分:2)

使用FTS表。设计FTS表以便任何SELECT语句都能正常工作。您甚至可以使用==或LIKE运算符直接搜索特定的文本值或模式。虽然标准操作员需要全表扫描,但它们会有些缓慢。

FTS系统的真正力量来自定制的MATCH运算符。此运算符能够利用围绕单个文本值构建的索引,从而允许对大量文本进行快速搜索。通常,使用类似于以下的查询进行搜索:

答案 2 :(得分:1)

问题在这里: 你的SQL是:

SELECT Name, Price FROM 

但是你获得了Category

的价值
int cat = c.getInt(c.getColumnIndex("Category")); 

答案 3 :(得分:1)

您正尝试访问类别字段,但在您的选择查询中,没有类别。您必须在选择查询中添加它才能使用它。