2013-09-28 82 views
1

我剛剛開始使用Datastore和Objectify(完整的新手),並且在建模實體之前我正在尋求一些建議。使用Objectify建模數據存儲實體的建議

我正在開發某種股票交易應用程序,用戶可以通過定義股票ID,目標價格和條件(比目標價格更低或更高的價格)跟蹤股票。

應用程序從外部網站獲取股票並將它們保存在一個數組中。然後需要檢查哪些StockTracking與數組中保存的股票價格匹配。

的StockTracking具有這樣的結構: StockCode,TargetPrice,條件(更低或更高)

我想要做的是一樣的東西:

for (Stock in stockArray) { 
    SELECT * FROM StockTracking WHERE StockCode = stock.code AND 
    ((Condition = 'Lower' AND TargetPrice <= Stock.price) OR 
    (Condition = 'Higher' AND TargetPrice >= Stock.price)) 
} 

我需要一些幫助確定如何和應該創建索引以便能夠像這樣查詢。另外,儘管股票數量是固定的,並不是那麼大(50歲以下),但我不知道是否有一種方法可以以更優化的方式執行此功能(即更低的查詢時間)。

在此先感謝

+0

只是爲了澄清,我願意把股票存放在數據存儲,如果執行「加入」會比這種方法 – momo

+0

客體是有不同的註解更有效如** @ Index **,您可以使用它來對特定字段進行索引。明智地使用索引,因爲這將對數據存儲具有更多的讀寫操作。 Objectify Library中還有Query類,它可以幫助你過濾這些字段。 –

+0

感謝@AnkurJain絕對初學者的任何好教程?官方文件我很迷茫。 – momo

回答

3

下面是一個通用的DAO類從我的工作,我在那裏的客體實施的幾乎所有基本的查詢之一。它實際上是一個使用模板類的基本對象化函數的通用實現。

package com.myweb.common.dao; 

import static com.googlecode.objectify.ObjectifyService.ofy; 

import java.util.List; 

import com.googlecode.objectify.Key; 
import com.googlecode.objectify.ObjectifyService; 
import com.myweb.common.exception.DatabaseException; 
import com.myweb.model.User; 

public abstract class AbstractGenericDaoImpl implements GenericDao{ 

static { 
    ObjectifyService.register(User.class); 
} 

@Override 
public <T> void create(T t) { 
    ofy().save().entity(t).now(); 
} 

@Override 
public <T> String createWithKey(T t) { 
    Key<T> key = ofy().save().entity(t).now(); 
    return key.getString(); 
} 

@Override 
public <T> Long createWithID(T t) { 
    Key<T> key = ofy().save().entity(t).now(); 
    return key.getId(); 
} 

@Override 
public <T> void update(Class<T> clazz, Long id, T t) throws DatabaseException { 
    if (id == null) { 
     throw new DatabaseException("ID cannot be null"); 
    } 
    T tnew = ofy().load().type(clazz).id(id).get(); 
    ofy().save().entity(tnew).now(); 
} 

@Override 
public <T> void update(Class<T> clazz, String key, T t) throws DatabaseException { 
    if (key == null) { 
     throw new DatabaseException("ID cannot be null"); 
    } 
    T tnew = ofy().load().type(clazz).id(key).get(); 
    ofy().save().entity(tnew).now(); 

} 

@Override 
public <T> T getById(Class<T> clazz, Long id) throws DatabaseException { 
    if (id == null) { 
     throw new DatabaseException("ID cannot be null"); 
    } 
    return ofy().load().type(clazz).id(id).get(); 
} 

@Override 
public <T> T getByKey(Class<T> clazz, String key) throws DatabaseException { 
    if (key == null) { 
     throw new DatabaseException("ID cannot be null"); 
    } 
    return ofy().load().type(clazz).id(key).get(); 
} 

@Override 
public <T> List<T> list(Class<T> clazz) { 
    List<T> list = ofy().load().type(clazz).list(); 
    return list; 
} 

@Override 
public <T> void delete(Class<T> clazz, Long id) throws DatabaseException { 
    if (id == null) { 
     throw new DatabaseException("ID cannot be null"); 
    } 
    T t = ofy().load().type(clazz).id(id).get(); 
    if(t != null){ 
     ofy().delete().entity(t).now(); 
    } 
} 

@Override 
public <T> void deleteByKey(Class<T> clazz, String key) throws DatabaseException { 
    if (key == null) { 
     throw new DatabaseException("ID cannot be null"); 
    } 
    T t = ofy().load().type(clazz).id(key).get(); 
    if(t != null){ 
     ofy().delete().entity(t).now(); 
    } 
} 
} 

以下是在Objectify中使用過濾器查詢示例的一種方法。

public User getUserByEmail(String email) { 
    return ofy().load().type(User.class).filter("email", email).first().get(); 
} 

與過濾清單領域

public List<User> getUsers(String f1, String f2) { 
    return ofy().load().type(User.class).filter("f1", f1).filter("f2", f2).list(); 
} 
+0

謝謝,這確實有用!只是一個問題,是否有可能通過除鍵之外的其他屬性加載實體過濾?我做了ofy().load()。type(StockTracking.class).filter(「deviceId =」,deviceId).filter(「stockCode =」,stockCode),但是這返回一個Query對象,我不知道如何獲取LoadResults以調用run() – momo

+1

您可以在任意數量的過濾器上進行查詢。在完成過濾器後,在最後添加**列表()**。 –

+0

@momo請檢查我更新後的回答,以回答您的問題 –

相關問題