簡體   English   中英

SQLiteOpenHelper在Android中翻譯SQLite查詢

[英]SQLiteOpenHelper translating SQLite query in Android

我有以下sqlite查詢:

select product.title, supermarket.title,
       datetime(price.timestamp,'localtime'), price.price
   from price inner join product on price.productid = product._id
   inner join supermarket on price.supermarketid = supermarket._id
where price.productid = 1
group by price.productid, price.supermarketid, price.timestamp
order by price.productid, price.supermarketid, price.timestamp

並且我想在SQLiteOpenHelper的幫助下構建查詢,所以我正在嘗試翻譯它:

    SQLiteDatabase db = mDbHelper.getReadableDatabase();

    // Define a projection that specifies which columns to read from the database
    String[] projection = {
            DBContract.Product.COLUMN_NAME_TITLE,
            DBContract.Supermarket.COLUMN_NAME_TITLE,
            "datetime(DBContract.Price.COLUMN_NAME_TIMESTAMP, 'localtime')",
            DBContract.Price.COLUMN_NAME_PRICE
    };

    // Define 'where' part of query.
    String selection = DBContract.Price.COLUMN_NAME_PRODUCT_ID + " LIKE ?";

    // Specify arguments in placeholder order.
    String[] selectionArgs = { String.valueOf(productId) };

    // Define grouping by rows
    String groupBy = DBContract.Price.COLUMN_NAME_PRODUCT_ID
            .concat(DBContract.Price.COLUMN_NAME_SUPERMARKET_ID)
            .concat(DBContract.Price.COLUMN_NAME_TIMESTAMP);

    // Define order by clause
    String orderBy = DBContract.Price.COLUMN_NAME_PRODUCT_ID
            .concat(DBContract.Price.COLUMN_NAME_SUPERMARKET_ID)
            .concat(DBContract.Price.COLUMN_NAME_TIMESTAMP);

    Cursor cursor = db.query(
            DBContract.Product.TABLE_NAME,          // The table to query
            projection,                             // The columns to return
            selection,                              // The columns for the WHERE clause
            selectionArgs,                          // The values for the WHERE clause
            groupBy,                                // don't group the rows
            null,                                   // don't filter by row groups
            orderBy                                 // The sort order
    );

我的問題是:

  1. 我不知道在投影中指定以下內容是否正確:

    datetime(DBContract.Price.COLUMN_NAME_TIMESTAMP,'localtime')

  2. 我不知道如何使用這種語法指定內部聯接。

我知道我可以通過直接構建查詢並執行它來做到這一點,但是我想這樣做,那么我該如何擺脫呢?

按查詢分組在任何數據庫上都需要大量開銷,因此請謹慎使用。 分組依據用於獲得小計和唯一結果。 假設時間戳對於productid和超級市場id來說是唯一的,因此我們不需要group by子句。 SQL like關鍵字在任何數據庫上也需要大量開銷,因此請謹慎使用。

select product.title, supermarket.title,timestamp, 
   datetime(price.timestamp,'localtime') lt, price.price
from price inner join product on price.productid = product._id
inner join supermarket on price.supermarketid = supermarket._id
where price.productid = ?
order by price.productid, price.supermarketid, price.timestamp

注意,我是如何選擇一個時間戳和一個本地時間戳的。 這是因為大多數數據庫不允許您對查詢中不存在的列進行排序,而我們希望向用戶顯示本地時間戳。 我給當地時間起個名字,以便以后可以實際使用。 我給產品一個參數標記。 稍后,我們需要創建一個視圖。

現在將簡化的SQL更改為視圖。

create view supermarketproductprice as 
select product.title, supermarket.title,timestamp, 
   datetime(price.timestamp,'localtime') lt, price.price
from price inner join product on price.productid = product._id
inner join supermarket on price.supermarketid = supermarket._id

我們需要在價格表上建立一個與查詢順序完全匹配的索引,以避免應用程序不響應味精。

create index price_ix1 on price order by price.productid, price.supermarketid, price.timestamp

理想情況下,您將在創建數據庫時創建索引並查看。 我有創建視圖並將索引語句創建為常量

db.execSQL(VERSION_66_CREATE_TABLE);
            db.execSQL(VERSION_66_CREATE_INDEX);
            db.execSQL(VERSION_66_CREATE_VIEW);

現在,它是從視圖中進行選擇的簡單方法。

// Define a projection that specifies which columns to read from the database
String[] projection = {
        DBContract.Product.COLUMN_NAME_TITLE,
        DBContract.Supermarket.COLUMN_NAME_TITLE,
 // extra column for processing sort     price.COULUM_NAME_TIMESTAMP,"datetime(DBContract.Price.COLUMN_NAME_TIMESTAMP, 'localtime')",
        DBContract.Price.COLUMN_NAME_PRICE
};

// Define 'where' part of query.
String selection = DBContract.Price.COLUMN_NAME_PRODUCT_ID + "= ?";

// Specify arguments in placeholder order.
String[] selectionArgs = { String.valueOf(productId) };


// Define order by clause
String orderBy = DBContract.Price.COLUMN_NAME_PRODUCT_ID + ","
        + DBContract.Price.COLUMN_NAME_SUPERMARKET_ID + ","
        + DBContract.Price.COLUMN_NAME_TIMESTAMP;

Cursor cursor = db.query(
        MYVIEWNAME,          // The view to query
        projection,                             // The columns to return
        selection,                              // The columns for the WHERE clause
        selectionArgs,                          // The values for the WHERE clause

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM