[英]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
);
我的問題是:
我不知道在投影中指定以下內容是否正確:
datetime(DBContract.Price.COLUMN_NAME_TIMESTAMP,'localtime')
我不知道如何使用這種語法指定內部聯接。
我知道我可以通過直接構建查詢並執行它來做到這一點,但是我想這樣做,那么我該如何擺脫呢?
按查詢分組在任何數據庫上都需要大量開銷,因此請謹慎使用。 分組依據用於獲得小計和唯一結果。 假設時間戳對於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.