2013-07-20 2 views
4

Ive essayé un millier de choses. En ce moment, la seule façon pour moi d'interroger quoi que ce soit est d'obtenir la liste entière et de la parcourir de cette façon! ce qui prend beaucoup de temps. Comment puis-je interroger quelque chose dans google app engine, par exemple tirer seulement les entités qui ont> 100 votes par exemple.utiliser le curseur pour interroger à partir de google app moteur dans android

J'ai essayé le curseur utilisateur, mais je ne sais pas comment cela fonctionne. Je sais qu'il peut utiliser un curseur mais comment puis-je le configurer avec google app engine puisque ma base de données n'est pas dans mon application par exemple?

Ive a essayé ... mais cette dose ne fonctionnera pas du tout ..

Cursor cursor = ("select * from Votes WHERE Votes >" + 250 , null); 
quotes endpoint.listquotes().setCursor(cursor).execute(); 

et

String query = ("select * from Votes WHERE Votes >= 40"); 
    quotes endpoint.listquotes().setCursor(query).execute(); 

Im suivant l'exemple tic-tac-toe https://github.com/GoogleCloudPlatform/appengine-endpoints-tictactoe-java et https://developers.google.com/eclipse/docs/endpoints-addentities Dans l'exemple que je viens commuté des notes pour des citations.

Hérite mon code actuel par exemple sur comment obtenir les entités.

protected CollectionResponseQuotes doInBackground(Context... contexts) { 

    Quotesendpoint.Builder endpointBuilder = new Quotesendpoint.Builder(
     AndroidHttp.newCompatibleTransport(), 
     new JacksonFactory(), 
     new HttpRequestInitializer() { 
     public void initialize(HttpRequest httpRequest) { } 
     }); 
    Quotesendpoint endpoint = CloudEndpointUtils.updateBuilder(
    endpointBuilder).build(); 
    try { 


    quotes = endpoint.listquotes().execute(); 

    for (Quotes quote : quotes.getItems()) { 

     if (quote.getVotes() > 3) { 

     quoteList.add(quote); 

     } 

} 

Voici le code généré par Google dans le moteur de l'application lorsque j'ai créé le point de terminaison. On dirait qu'il questionnera en quelque sorte mais je ne peux pas le comprendre. Ce sont deux projets différents.

@Api(name = "quotesendpoint", namespace = @ApiNamespace(ownerDomain = "projectquotes.com"   ownerName = "projectquotes.com", packagePath = "")) 
public class quotesEndpoint { 

/** 
* This method lists all the entities inserted in datastore. 
* It uses HTTP GET method and paging support. 
* 
* @return A CollectionResponse class containing the list of all entities 
* persisted and a cursor to the next page. 
*/ 
@SuppressWarnings({ "unchecked", "unused" }) 
@ApiMethod(name = "listquotes") 
public CollectionResponse<quotes> listquotes(
     @Nullable @Named("cursor") String cursorString, 
     @Nullable @Named("limit") Integer limit) { 

EntityManager mgr = null; 
Cursor cursor = null; 
List<quotes> execute = null; 

try { 
    mgr = getEntityManager(); 
    Query query = mgr.createQuery("select from quotes as quotes"); 
    if (cursorString != null && cursorString != "") { 
     cursor = Cursor.fromWebSafeString(cursorString); 
     query.setHint(JPACursorHelper.CURSOR_HINT, cursor); 
    } 

    if (limit != null) { 
     query.setFirstResult(0); 
     query.setMaxResults(limit); 
    } 

    execute = (List<quotes>) query.getResultList(); 
    cursor = JPACursorHelper.getCursor(execute); 
    if (cursor != null) 
     cursorString = cursor.toWebSafeString(); 

    // Tight loop for fetching all entities from datastore and accomodate 
    // for lazy fetch. 
    for (quotes obj : execute) 
     ; 
} finally { 
    mgr.close(); 
} 

return CollectionResponse.<quotes> builder().setItems(execute) 
     .setNextPageToken(cursorString).build(); 

Répondre

3

Dans Google App Engine vous devez configurer un servlet pour interroger la base de données pour vous et puis retourner les résultats en JSON, voir ici pour plus d'informations: https://developers.google.com/appengine/docs/java/datastore/queries https://github.com/octo-online/robospice https://developers.google.com/appengine/docs/java/#Requests_and_Servlets https://code.google.com/p/google-gson/

Vous finiriez par interroger en utilisant http: // your-url/query? + chaîne de requête

EDIT: Aperçu!

Ceci est une version d'Aperçu de Google Cloud Endpoints. Par conséquent, l'API est susceptible d'être modifiée et le service lui-même n'est actuellement pas couvert par un contrat SLA ou une politique d'obsolescence. Ces caractéristiques seront évaluées au fur et à mesure que l'API et le service seront déplacés vers la disponibilité générale, mais les développeurs doivent en tenir compte lors de l'utilisation de la version Preview de Google Cloud Endpoints lors de la publication .

La fonction curseur est probablement en cours de développement. Mais je ne sais pas non plus pourquoi vous voudriez utiliser des curseurs, car les collections sont tellement plus faciles à utiliser ... Ne préféreriez-vous pas faire ce qui est en dessous de l'horrible code ci-dessus? :)

ScoreCollection scores = service.scores().list().execute(); 
+0

hmm alors pourquoi ne fournit google la fonction de curseur de jeu? Je pensais que c'était pour les questions? – NightSkyCode

+1

réponse éditée :) –

+0

Hey Rsen! im en train de faire ça! haha, je viens de supposer google app moteur n'a pas faire paresseux fetch!Je pensais que quand je l'ai couru de cette façon, il téléchargeait tous les objets dans le datastore (base de données)! Savez-vous si c'est le cas ou pas? – NightSkyCode

1

Mettez à jour votre méthode de liste à prendre dans un attribut de filtre

@SuppressWarnings({ "unchecked", "unused" }) 
@ApiMethod(name = "listZeppaUserInfo") 
public CollectionResponse<ZeppaUserInfo> listZeppaUserInfo(
     @Nullable @Named("filter") String filterString, 
     @Nullable @Named("cursor") String cursorString, 
     @Nullable @Named("limit") Integer limit) { 

    PersistenceManager mgr = null; 
    Cursor cursor = null; 
    List<ZeppaUserInfo> execute = null; 

    try { 
     mgr = getPersistenceManager(); 
     Query query = mgr.newQuery(ZeppaUserInfo.class); 
     if (isWebSafe(cursorString)) { 
      cursor = Cursor.fromWebSafeString(cursorString); 
      HashMap<String, Object> extensionMap = new HashMap<String, Object>(); 
      extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor); 
      query.setExtensions(extensionMap); 
     } else if (isWebSafe(filterString)){ 
      // query has a filter 
      query.setFilter(filterString); 
     } 

     if (limit != null) { 
      query.setRange(0, limit); 
     } 

     execute = (List<ZeppaUserInfo>) query.execute(); 
     cursor = JDOCursorHelper.getCursor(execute); 
     if (cursor != null) 
      cursorString = cursor.toWebSafeString(); 

     // Tight loop for fetching all entities from datastore and 
     // accomodate 
     // for lazy fetch. 
     for (ZeppaUserInfo obj : execute) 
      ; 
    } finally { 
     mgr.close(); 
    } 

    return CollectionResponse.<ZeppaUserInfo> builder().setItems(execute) 
      .setNextPageToken(cursorString).build(); 
}