2014-11-01 13 views
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?我應該在哪裏調用它,以便每次用戶向數據庫添加內容時都會更新?

+0

嘿,看起來我覺得它不是那麼容易更新數據從一個表到另一個表。我可以給你提示如何去做。檢查天氣你的虛擬表需要更新。如果是,則從主表中選擇光標中的唯一數據並將其插入for循環中。如果需要更新,您應該爲檢查表定義1個額外的列。 – 2014-11-01 12:57:17

+0

是否有其他解決方案,而不是更新它,以便在通過虛擬表進行搜索時包含新數據。我如何使用原始表格中的內容填充VT? – 2014-11-01 13:01:22

+0

我認爲你應該在兩個表格中添加一個額外的列表,如「版本」,並且第一次將數據複製到VT時,您的VT數據將包含版本= 1,現在當您想要更新主表格而不是將新數據的增量值更新爲版本時: 2現在從VT表中檢查版本= 2,如果不是,則將版本= 2的所有數據插入VT。 – 2014-11-01 13:04:28

回答

1

這就是我如何解決我的問題。

在我的數據庫I類添加了這些方法:

public long createItem(String name, String size, String price, String brand) { 

    ContentValues initialValues = new ContentValues(); 
    String searchValue =  name + " " + 
          size + " " + 
          price + " " + 
          brand; 
    initialValues.put(KEY_ITEM, name); 
    initialValues.put(KEY_SIZE, size); 
    initialValues.put(KEY_PRICE, price); 
    initialValues.put(KEY_BRAND, brand); 
    initialValues.put(KEY_CATAGORY, catagory); 
    initialValues.put(KEY_SEARCH, searchValue); 

    return db.insert(FTS_VIRTUAL_TABLE, null, initialValues); 
} 


public Cursor listAll(){ 
    String buildSQL = "SELECT * FROM " + ITEM_TABLE_NAME; 
    Log.d(TAG, "listAll SQL: " + buildSQL); 

    return db.rawQuery(buildSQL, null); 
} 

    public boolean deleteAllItems() { 

    int doneDelete = 0; 
    doneDelete = db.delete(FTS_VIRTUAL_TABLE, null , null); 
    Log.w(TAG, Integer.toString(doneDelete)); 
    return doneDelete > 0; 

} 

而在我的MainActivity我使用的遊標遍歷經過我的原始表並填寫我的虛擬表的內容:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setTitle(""); 
    dbHelper = new DBHelper(this); 
    dbHelper.deleteAllCustomers(); 
    fillVT(); 
} 

public void fillVT(){ 
    String a, b, x, y, z; 
     Cursor c = dbHelper.listAll(); 
     if(c.moveToFirst()){ 
      do{ 
       a = c.getString(1); 
       b = c.getString(2); 
       x = c.getString(3); 
       y = c.getString(4); 
       z = c.getString(5); 

       dbHelper.createCustomer(a, b, x, y, z);  
      }while(c.moveToNext()); 
     } 
    } 

@Override 
protected void onActivityResult(int reqCode, int resCode, Intent data){ 
    super.onActivityResult(reqCode, resCode, data); 

    if(reqCode == ENTER_DATA_REQUEST_CODE && resCode == RESULT_OK){ 
     dbHelper.addItem(data.getExtras().getString("tag_item_item_name"), 
          data.getExtras().getString("tag_item_item_size"), 
          data.getExtras().getString("tag_item_item_price"), 
          data.getExtras().getString("tag_item_item_brand"), 
          data.getExtras().getString("tag_item_item_catagory")); 
     dbHelper.deleteAllCustomers(); 
     fillVT(); 
     cursorAdapter.changeCursor(dbHelper.listAll()); 
    } 
} 

我在onActivityResult()中添加了dbHelper.deleteAllCustomers()和fillVT(),以便每次添加新項目時都會更新虛擬表格