configurar - Búsqueda a través de datos de firebase: iOS, Swift
firebase ios swift example (3)
Así que comience con un nodo de productos para todos los productos. El nombre del nodo se crea con childByAutoId.
products
-abcde
name: MacBook
color: black
display: retina
port: Thunderbolt
size: 13
-fghij
name: MacBook Air
color: black
display: standard
port: USB
size: 13
-xxxxx
name... etc etc
Luego dividimos las especificaciones y volvemos a referirnos a los productos en cada nodo.
specs
black
13
abcde: true
fghij: true
15
xxxx: true
grey
13
yyyy: true
zzzz: true
15
qqqq: true
13
abcde: true
fghij: true
yyyy: true
zzzz: true
Si quieres todo negro, 13 "Macs, observaSingleEventOfType of .Value en el
specs/black/13
nodo que cargará en las referencias de producto abcde y fghij.
Si desea obtener todas las laptops de 15 pulgadas grises, haga lo mismo en el
specs/grey/15
nodo.
Si quieres todas las laptops de 13 pulgadas, observa el
specs/13
nodo
La belleza de esto es que no necesita ninguna consulta, ya que sabe específicamente qué datos está buscando. Las consultas son muy pesadas en comparación con un evento de observación.
Otra opción es compilar las especificaciones en líneas individuales
specs
-abcde
black_13_retina_SSD_Thunderbolt
13_retina_SSD_Thunderbolt
retina_SSD_Thunderbolt
SSD_Thunderbolt
Thunderbolt
.
.
-fgijk
black_13_standard_SSD_USB
13_standard_SSD_USB
etc
A continuación, puede consultar fácilmente todos los modelos que tengan SSD_Thunderbolt.
También puede consultar todos los productos que comienzan con: 13_ y termina con: 13_
Tendrá que poner las diversas combinaciones dentro de cada especificación para poder consultar 13_SSD, pero si solo tiene 3 o 4 especificaciones, no es tan malo.
Recuerde: el espacio en disco es barato y no tenga miedo de duplicar datos en diferentes formatos para recuperar lo que desea. Además, crear un analizador para leer el producto principal, analizarlo y volcar las especificaciones en sus combinaciones es bastante simple.
Espero que ayude.
Quería saber si es posible y cómo puedes buscar a través de Firebase. Mi aplicación tiene un campo de texto donde puede completar algunas especificaciones que se ''guardan'' en una matriz.
por ejemplo:
var arrayOfSpecs = ["13''", "Black"]
Ahora quiero buscar con 2 opciones segmentadas:
Busque el nombre de uno de los Elektronics que tenga una especificación de 13 "o sea negro" (este dispositivo elektronic puede tener otras especificaciones, pero debe incluir al menos una de las especificaciones especificadas)
Busque el nombre de uno de los Elektronics que solo tenga las especificaciones que escribí, menos especificaciones están bien, pero no más especificaciones que donde la persona buscó.
Ejemplo : Buscar "negro" "13 pulgadas"; searchResults podría incluir un macbook con una especificación: "negro", pero también podría incluir un macbook Pro con 2 especificaciones: "negro" y "13 pulgadas", pero no puede incluir un macbook Air con especificaciones: "Negro", " 13 pulgadas "," Retina "
El resultado de búsqueda vendría en una vista de tabla, o almacenaría los nombres correctos de los resultados de búsqueda en la matriz, que pondría en una UITableView
Debajo de mi base de datos, espero que entiendas lo que estoy buscando.
Gracias
Cambia tu estructura JSON a
Electroniks:{
Macbook:{..,
Specification:{
13inch : true,
black : true
},
...
},
iPhone:{..,
Specification:{
13inch : true,
black : true,
camera : true
},
...
},
iPad:{..,
Specification:{
xinch : true,
red : true,
camera : true
},
...
}
}
No creo que pueda hacer coincidir dos consultas de nodo a la vez, pero lo que puede hacer es, puede hacer coincidir una especificación .queryEqualToValue
a la vez
Entonces, una solución alternativa sería: recuperar todos los parentNodes que tienen una especificación particular y luego iterar a través de ellos para que coincidan con su otra especificación
let parentRef = FIRDatabase.database().reference().child("Elektronics")
parentRef.queryOrderedByChild("Specification/black").queryEqualToValue(true).observeSingleEventOfType(.Value, withBlock: {(snap) in
if let dict = snap.value as? [String:AnyObject]{
for each in dict{
print(each.0) //Would retrieve you every product name with colour black in specification i.e Macbook and iPhone
print((each.1["Specification"] as! NSDictionary).count)//Number of specification
parentRef.child("each.0").child("Specification").child("13inch").observeSingleEventOfType(.Value, withBlock: {(snapshot) in
if snapshot.exists(){
print(each.0) //You found your product''s with exactly 13inch and black Specification.This is their name
}
})
}
}else{
print(snap.ref)
}
})
También podría usar una solución SQL en lugar de Key-Value. Firebase es estrictamente una base de datos de valores clave.