2014-11-01 130 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(),以便每次添加新项目时都会更新虚拟表格