Referencia de propiedad de la entidad

Cloud Datastore es compatible con diversos tipos de datos para valores de propiedad. Se incluyen, entre otros:

  • Enteros
  • Números de coma flotante
  • Strings
  • Fechas
  • Datos binarios

Para obtener una lista completa de los tipos, consulta Tipos de valores y propiedades.

Tipos de valores y propiedades

Los valores de datos asociados con una entidad constan de una o más propiedades. Cada propiedad tiene un nombre y uno o más valores. Una propiedad puede tener valores de más de un tipo, y dos entidades pueden tener valores de diferentes tipos para la misma propiedad. Las propiedades pueden estar indexadas o no (las consultas que ordenan o filtran en una propiedad P ignorarán las entidades en las que P no está indexada). Una entidad puede tener como máximo 20,000 propiedades indexadas.

Se admiten los tipos de valor siguientes:

Tipo de valor Tipo(s) de Java Ordenar por Notas
Número entero short
int
long
java.lang.Short
java.lang.Integer
java.lang.Long
Numérico Se almacena como un número entero largo, luego se convierte al tipo de campo

Exceso de valores fuera de rango
Número de coma flotante float
double
java.lang.Float
java.lang.Double
Numérico Doble precisión de 64 bits,
IEEE 754
Booleano boolean
java.lang.Boolean
false<true
String de texto (corta) java.lang.String Unicode Hasta 1,500 bytes

Valores superiores a 1,500 bytes arrojan IllegalArgumentException
String de texto (larga) com.google.appengine.api.datastore.Text Ninguno Hasta 1 megabyte

No indexada
String de bytes (corta) com.google.appengine.api.datastore.ShortBlob Orden de bytes Hasta 1,500 bytes

Valores más largos que 1,500 bytes arrojan IllegalArgumentException
String de bytes (larga) com.google.appengine.api.datastore.Blob Ninguno Hasta 1 megabyte

No indexada
Fecha y hora java.util.Date Cronológico
Punto geográfico com.google.appengine.api.datastore.GeoPt Por latitud,
luego longitud
Dirección postal com.google.appengine.api.datastore.PostalAddress Unicode
Número de teléfono com.google.appengine.api.datastore.PhoneNumber Unicode
Dirección de correo electrónico com.google.appengine.api.datastore.Email Unicode
Usuario de Cuentas de Google com.google.appengine.api.users.User Dirección de correo electrónico
en orden de Unicode
Controlador de mensajería instantánea com.google.appengine.api.datastore.IMHandle Unicode
Vínculo com.google.appengine.api.datastore.Link Unicode
Categoría com.google.appengine.api.datastore.Category Unicode
Calificación com.google.appengine.api.datastore.Rating Numérico
Clave de Cloud Datastore com.google.appengine.api.datastore.Key
o el objeto referenciado (como secundario)
Por elementos de ruta
(tipo, identificador,
tipo, identificador…)
Hasta 1,500 bytes

Valores más largos que 1,500 bytes arrojan IllegalArgumentException
Clave de Blobstore com.google.appengine.api.blobstore.BlobKey Orden de bytes
Entidad incorporada com.google.appengine.api.datastore.EmbeddedEntity Ninguno No indexada
Nulo null Ninguno

Importante: Recomendamos que evites almacenar users.User como un valor de propiedad, porque incluye la dirección de correo electrónico junto con el ID único. Si un usuario cambia su dirección de correo electrónico y comparas el user.User almacenado anterior con el valor nuevo de user.User, no van a coincidir. En su lugar, usa el valor de ID de usuario User como el identificador único y estable del usuario.

Para strings de texto y datos binarios sin codificación (strings de bytes), Cloud Datastore es compatible con dos tipos de valores:

  • Se indexan strings cortas (hasta 1,500 bytes) y se pueden usar en condiciones de filtro de consulta y órdenes de clasificación.
  • No se indexan strings largas (hasta 1 megabyte) y no pueden usarse en filtros de consulta ni órdenes de clasificación
Nota: El tipo de string de bytes larga se denomina Blob en la API de Cloud Datastore. Este tipo no está relacionado con los blobs que se usan en la API de Blobstore.

Cuando una consulta incluye una propiedad con valores de varios tipos, Cloud Datastore usa un orden determinista basado en las representaciones internas:

  1. Valores nulos
  2. Números de coma fija
    • Números enteros
    • fechas y horarios
    • calificaciones
  3. Valores booleanos
  4. Secuencias de bytes
    • String de bytes
    • String de Unicode
    • Claves de Blobstore
  5. Números de coma flotante
  6. Puntos geográficos
  7. Usuarios de Cuentas de Google
  8. Claves de Cloud Datastore

Debido a que las strings de texto largas, las strings de bytes largas y las entidades incorporadas no se indexan, no tienen orden definido.

Propiedades repetidas

Puedes almacenar varios valores dentro de una sola propiedad.

Java 8

Entity employee = new Entity("Employee");
ArrayList<String> favoriteFruit = new ArrayList<String>();
favoriteFruit.add("Pear");
favoriteFruit.add("Apple");
employee.setProperty("favoriteFruit", favoriteFruit);
datastore.put(employee);

// Sometime later
employee = datastore.get(employee.getKey());
@SuppressWarnings("unchecked") // Cast can't verify generic type.
    ArrayList<String> retrievedFruits = (ArrayList<String>) employee
    .getProperty("favoriteFruit");

Java 7

Entity employee = new Entity("Employee");
ArrayList<String> favoriteFruit = new ArrayList<String>();
favoriteFruit.add("Pear");
favoriteFruit.add("Apple");
employee.setProperty("favoriteFruit", favoriteFruit);
datastore.put(employee);

// Sometime later
employee = datastore.get(employee.getKey());
@SuppressWarnings("unchecked") // Cast can't verify generic type.
ArrayList<String> retrievedFruits = (ArrayList<String>) employee.getProperty("favoriteFruit");

Entidades incorporadas

A veces puede resultar práctico incorporar una entidad como una propiedad de otra entidad. Esto puede ser útil, por ejemplo, para crear una estructura jerárquica de valores de propiedad dentro de una entidad. La clase EmbeddedEntity de Java te permite hacer lo siguiente:

Java 8

// Entity employee = ...;
EmbeddedEntity embeddedContactInfo = new EmbeddedEntity();

embeddedContactInfo.setProperty("homeAddress", "123 Fake St, Made, UP 45678");
embeddedContactInfo.setProperty("phoneNumber", "555-555-5555");
embeddedContactInfo.setProperty("emailAddress", "test@example.com");

employee.setProperty("contactInfo", embeddedContactInfo);

Java 7

// Entity employee = ...;
EmbeddedEntity embeddedContactInfo = new EmbeddedEntity();

embeddedContactInfo.setProperty("homeAddress", "123 Fake St, Made, UP 45678");
embeddedContactInfo.setProperty("phoneNumber", "555-555-5555");
embeddedContactInfo.setProperty("emailAddress", "test@example.com");

employee.setProperty("contactInfo", embeddedContactInfo);

Las propiedades de una entidad incorporada no se indexan y no se pueden usar en consultas. Opcionalmente, puedes asociar una clave con una entidad incorporada, pero (a diferencia de una entidad completa) no es necesaria la clave e, incluso si existe, no se puede usar para recuperar la entidad.

En lugar de propagar manualmente las propiedades de la entidad incorporada, puedes usar el método setPropertiesFrom() para copiarlas desde una entidad existente:

Java 8

// Entity employee = ...;
// Entity contactInfo = ...;
EmbeddedEntity embeddedContactInfo = new EmbeddedEntity();

embeddedContactInfo.setKey(contactInfo.getKey()); // Optional, used so we can recover original.
embeddedContactInfo.setPropertiesFrom(contactInfo);

employee.setProperty("contactInfo", embeddedContactInfo);

Java 7

// Entity employee = ...;
// Entity contactInfo = ...;
EmbeddedEntity embeddedContactInfo = new EmbeddedEntity();

embeddedContactInfo.setKey(contactInfo.getKey()); // Optional, used so we can recover original.
embeddedContactInfo.setPropertiesFrom(contactInfo);

employee.setProperty("contactInfo", embeddedContactInfo);

Puedes usar más adelante el mismo método para recuperar la entidad original de la entidad incorporada:

Java 8

Entity employee = datastore.get(employeeKey);
EmbeddedEntity embeddedContactInfo = (EmbeddedEntity) employee.getProperty("contactInfo");

Key infoKey = embeddedContactInfo.getKey();
Entity contactInfo = new Entity(infoKey);
contactInfo.setPropertiesFrom(embeddedContactInfo);

Java 7

Entity employee = datastore.get(employeeKey);
EmbeddedEntity embeddedContactInfo = (EmbeddedEntity) employee.getProperty("contactInfo");

Key infoKey = embeddedContactInfo.getKey();
Entity contactInfo = new Entity(infoKey);
contactInfo.setPropertiesFrom(embeddedContactInfo);

Usar una lista vacía

Históricamente, Cloud Datastore no tenía una representación para una propiedad que represente una lista vacía. El SDK de Java solucionó esto almacenando colecciones vacías como valores nulos, por lo que no hay manera de distinguir entre valores nulos y listas vacías. Para mantener la compatibilidad inversa, este sigue siendo el comportamiento predeterminado, que se resume de la siguiente manera:

  • Las propiedades nulas se escriben como nulas en Cloud Datastore.
  • Las colecciones vacías se escriben como nulas en Cloud Datastore.
  • Un nulo se lee como nulo desde Cloud Datastore.
  • Una colección vacía se lee como nula.

Sin embargo, si modificas el comportamiento predeterminado, el SDK para Java de Appengine Datastore será compatible con el almacenamiento de listas vacías. Recomendamos que consideres las consecuencias de modificar el comportamiento predeterminado de tu aplicación y luego actives la asistencia para listas vacías.

Para modificar el comportamiento predeterminado y así poder usar listas vacías, configura la propiedad DATASTORE_EMPTY_LIST_SUPPORT durante la inicialización de tu aplicación de la siguiente manera:

System.setProperty(DatastoreServiceConfig.DATASTORE_EMPTY_LIST_SUPPORT, Boolean.TRUE.toString());

Con esta propiedad configurada en true como se muestra más arriba:

  • Las propiedades nulas se escriben como nulas en Cloud Datastore.
  • Las colecciones vacías se escriben como lista vacía en Cloud Datastore.
  • Un nulo se lee como nulo desde Cloud Datastore.
  • Cuando se lee desde Cloud Datastore, se muestra una lista vacía como una Colección vacía.
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Java 8