android sqlite match ничего не возвращает - PullRequest
1 голос
/ 24 февраля 2012

это мой код для создания таблицы fts3

db.execSQL("CREATE VIRTUAL TABLE [videorecipes] USING FTS3 (" + "[recipeID] TEXT, " + "[recipeName] TEXT, " + "[video] TEXT, " + "[thumbs"] TEXT, " + "[ownerID"] TEXT, " + "[chefID"] TEXT, ");");

Теперь, если я запросил это, используя что-то вроде этого

Cursor c = sqlDatabase.rawQuery("select docid as _id, recipeID, recipeName, thumbs from videorecipes where ownerID = ? AND chefID = ?", new String[] { ownerID, chefID });

это работает, я получил возвращенные данные, но когда я попытался выполнить поиск, используя полный текст, подобный этому

Cursor c = sqlDatabase.rawQuery("select docid as _id, recipeID, recipeName, thumbs  from videorecipes  where recipeName MATCH ? AND ownerID = ? and chefID = ?, new String[] { searchRecipeName, ownerID, chefID  });

ничего не возвращает. я даже не знаю, как вывести любую ошибку из ошибки sql, если таковая имеется. кстати вот как я назвал адаптер

mCursor = dbAdapter.searchRecipe(searchString);

for(mCursor.moveToFirst(); mCursor.moveToNext(); mCursor.isAfterLast()) {
            alRecipeID.add(mCursor.getString(1));
}

я сделал полнотекстовый поиск неправильно?

примечание: вышеприведенный адаптер возвращает данные, если я не использовал запрос 'match' для полнотекстового поиска.

1 Ответ

1 голос
/ 24 февраля 2012

Для начала, это лучше:

for(mCursor.moveToNext()) {
   alRecipeID.add(mCursor.getString(1));
}

Редактировать :

while(mCursor.moveToNext()) {
   alRecipeID.add(mCursor.getString(1));
}

И вашпроблема должна быть решена, если вы просто используете предложение MATCH для фильтрации своего выбора в полнотекстовом поиске, например:

SELECT 
    docid as _id, 
    recipeID, 
    recipeName, 
    thumbs 
FROM 
    videorecipes 
WHERE 
    videorecipes 
MATCH 
    'recipeName:Yourtextgoeshere ownerID:1234 chefID:2345'

Вам придется вручную форматировать оператор MATCH, так как подстановочные знаки собираютсяработают необычайно плохо, что-то вроде этого:

sqlDatabase.rawQuery("SELECT docid as _id, recipeID, recipeName, thumbs" +
    " FROM videorecipes WHERE videorecipes MATCH ?", 
    new String[]{"recipeName:Yourtextgoeshere ownerID:1234 chefID:2345"}); 

Изменить, теперь с примером кода : протестировано на Android, и, кажется, оно работает нормально.

SQLiteOpenHelper helper = new SQLiteOpenHelper(this, "fts3.db", null, 1) {
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE VIRTUAL TABLE [videorecipes] USING FTS3 (" + "[recipeID] TEXT, "
                + "[recipeName] TEXT, " + "[video] TEXT, " + "[thumbs] TEXT, "
                + "[ownerID] TEXT, " + "[chefID] TEXT)");
    }
};

SQLiteDatabase db = helper.getWritableDatabase();
// Put something in the db
ContentValues values = new ContentValues();
for (int i = 0; i < 20; i++) {
    values.put("recipeID", i);
    values.put("recipeName", "Recipe #" + i);
    values.put("video", "Video" + i + ".avi");
    values.put("thumbs", "thumb" + i + ".jpg");
    // 10 for the ownerID 148 and 10 for the ownerID 1481
    values.put("ownerID", i < 10 ? "148" : "1481");
    values.put("chefID", i);
    db.insert("videorecipes", "chefID", values);
}

Cursor c = db.rawQuery("SELECT docid as _id, recipeID, recipeName, thumbs, ownerID " +
        "FROM videorecipes WHERE videorecipes MATCH ?" ,
        new String[]{"ownerID:1481 recipeName:Recipe"});

int count = c.getColumnCount();
while (c.moveToNext()) {
    for (int i = 0; i < count; i++) {
        System.out.println(c.getColumnName(i) + "=" + c.getString(i));
    }
    System.out.println("-----------------------------");
}
db.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...