2012-02-24 3 views
1

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

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

FTS3 теперь, если я опрошен его, используя что-то вроде этого

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' для полнотекстового поиска.

+0

ваш для цикла является чуть чуть сломана, я предполагаю, что вы имели в виду 'для (mCursor.moveToFirst(); mCursor.isAfterLast(); mCursor.moveToNext())'. Вы можете выразить это более кратко как 'while (mCursor.moveToNext()) btw. – Jens

+0

@ Android, uh .. [* no *, * no * раз * десять *] (http://www.sqlite.org/lang_createvtab.html). – Jens

ответ

1

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

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

Edit:

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"}); 

Edit, теперь с примерами кода: Испытано на 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(); 
+0

для (mCursor.moveToNext()) возвращает ошибку мне – imin

+0

и я попытался сделать это sqlDatabase.rawQuery ("SELECT DocId в _id, RecipeID, RecipeName, большие пальцы" + "ОТ videorecipes ГДЕ videorecipes MATCH?", новый String [ ] { "RecipeName: Yourtextgoeshere"}); и курсор ничего не возвращает. Кстати, вы уверены, что это «с видеорецептов, где видеозвонки совпадают?» .. а не что-то вроде «от видеорецептов, где recipeName?» – imin

+0

Я попробовал sql-запрос, который вы указали выше (или любой запрос с совпадением) в браузере базы данных sqlite (я вытащил db из моего эмулятора Android на свой жесткий диск и откройте его с помощью браузера базы данных sqlite), но он возвращает ошибку «нет такого модуля : FTS3 ' – imin

Смежные вопросы