0
我剛剛發現使用虛擬表來搜索數據庫內容的可能性。然而,現在我已經坐了兩天了,而且我想我每小時都會變笨。有人能給我提供一個簡單的例子,說明我如何做到這一點?如何使用常規表中的內容填充fts虛擬表?
這是林在: 我得到了一個數據庫類:
public class DBHelper {
private static final String TAG = DBHelper.class.getSimpleName();
//Database config
private static int DATABASE_VERSION = 2;
public static String DATABASE_NAME = "shoppingdatabase.db";
//Item table config
private static final String ITEM_TABLE_NAME = "item_table";
private static final String ITEM_TABLE_COLUMN_ID = "_id";
private static final String ITEM_TABLE_COLUMN_ITEM_NAME = "item_name";
private static final String ITEM_TABLE_COLUMN_ITEM_SIZE = "item_size";
private static final String ITEM_TABLE_COLUMN_ITEM_PRICE = "item_price";
private static final String ITEM_TABLE_COLUMN_ITEM_BRAND = "item_brand";
private static final String ITEM_TABLE_COLUMN_ITEM_CATAGORY = "item_catagory";
//Viritual table config
public static final String KEY_ROWID = "rowid";
public static final String KEY_ITEM = "name";
public static final String KEY_SIZE = "size";
public static final String KEY_PRICE = "price";
public static final String KEY_BRAND = "brand";
public static final String KEY_CATAGORY = "catagory";
public static final String KEY_SEARCH = "searchData";
private static final String FTS_VIRTUAL_TABLE = "ItemInfo";
private DatabaseHelper dbHelper;
private SQLiteDatabase db;
public DBHelper(Context aContext){
dbHelper = new DatabaseHelper(aContext);
db = dbHelper.getWritableDatabase();
}
//I use this method in my AddItem class for the user to add an item to the database
public void addItem(String iName, String iSize, String iPrice, String iBrand, String iCatagory){
ContentValues cv = new ContentValues();
cv.put(ITEM_TABLE_COLUMN_ITEM_NAME, iName);
cv.put(ITEM_TABLE_COLUMN_ITEM_SIZE, iSize);
cv.put(ITEM_TABLE_COLUMN_ITEM_PRICE, iPrice);
cv.put(ITEM_TABLE_COLUMN_ITEM_BRAND, iBrand);
cv.put(ITEM_TABLE_COLUMN_ITEM_CATAGORY, iCatagory);
db.insert(ITEM_TABLE_NAME, null, cv);
}
public void populateVT() {
}
private class DatabaseHelper extends SQLiteOpenHelper{
public DatabaseHelper(Context aContext){
super(aContext, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqliteDB){
String buildSQL = "CREATE TABLE " + ITEM_TABLE_NAME + "("
+ ITEM_TABLE_COLUMN_ID + " INTEGER PRIMARY KEY, "
+ ITEM_TABLE_COLUMN_ITEM_NAME + " TEXT, "
+ ITEM_TABLE_COLUMN_ITEM_SIZE + " TEXT, "
+ ITEM_TABLE_COLUMN_ITEM_PRICE + " TEXT, "
+ ITEM_TABLE_COLUMN_ITEM_BRAND + " TEXT, "
+ ITEM_TABLE_COLUMN_ITEM_CATAGORY + " TEXT)";
String buildSQL2 = "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + " USING fts3(" +
KEY_ITEM + "," +
KEY_SIZE + "," +
KEY_PRICE + "," +
KEY_BRAND + "," +
KEY_CATAGORY + "," +
KEY_SEARCH + "," +
" UNIQUE (" + KEY_ITEM + "));";
Log.d(TAG, "onCreate SQL: " + buildSQL);
Log.d(TAG, "onCreate SQL: " + buildSQL2);
sqliteDB.execSQL(buildSQL);
sqliteDB.execSQL(buildSQL2);
}
@Override
public void onUpgrade(SQLiteDatabase sqliteDB, int oldVersion, int newVersion){
String buildSQL = "DROP TABLE IF EXISTS " + ITEM_TABLE_NAME;
String buildSQL2 = "DROP TABLE IF EXISTS " + FTS_VIRTUAL_TABLE;
Log.d(TAG, "onUpgrade SQL: " + buildSQL);
Log.d(TAG, "onUpgrade SQL: " + buildSQL2);
sqliteDB.execSQL(buildSQL);
sqliteDB.execSQL(buildSQL2);
onCreate(sqliteDB);
}
}
}
如何使用populateVT()與內容從 填充虛擬表ITEM_TABLE_NAME?我應該在哪裏調用它,以便每次用戶向數據庫添加內容時都會更新?
嘿,看起來我覺得它不是那麼容易更新數據從一個表到另一個表。我可以給你提示如何去做。檢查天氣你的虛擬表需要更新。如果是,則從主表中選擇光標中的唯一數據並將其插入for循環中。如果需要更新,您應該爲檢查表定義1個額外的列。 – 2014-11-01 12:57:17
是否有其他解決方案,而不是更新它,以便在通過虛擬表進行搜索時包含新數據。我如何使用原始表格中的內容填充VT? – 2014-11-01 13:01:22
我認爲你應該在兩個表格中添加一個額外的列表,如「版本」,並且第一次將數據複製到VT時,您的VT數據將包含版本= 1,現在當您想要更新主表格而不是將新數據的增量值更新爲版本時: 2現在從VT表中檢查版本= 2,如果不是,則將版本= 2的所有數據插入VT。 – 2014-11-01 13:04:28