Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
db:db4o [2010/02/21 16:40] alfred |
db:db4o [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 45: | Línea 45: | ||
| * {{db:db4o:objectmanager-_6.4-java.zip|ObjectManager}} | * {{db:db4o:objectmanager-_6.4-java.zip|ObjectManager}} | ||
| - | ==== Acciones básicas ==== | + | |
| - | === Insertar === | + | |
| - | === Actualizar === | + | |
| - | === Eliminar === | + | |
| Línea 71: | Línea 71: | ||
| IObjectSet result = db.Get(new Car () { marca = null }); | IObjectSet result = db.Get(new Car () { marca = null }); | ||
| </code> | </code> | ||
| + | === Filtrar elementos === | ||
| + | Para lanzar la consulta simplemente llamaríamos al ''Get'' sólo asignando la propiedad por la que queremos buscar: | ||
| + | <code chsarp> | ||
| + | IObjectSet result = db.Get(new Pilot () { Name = "Pedro" }); | ||
| + | </code> | ||
| + | === Utilizando el método Query (Native Query) === | ||
| + | Podemos utilizar el método ''Query'' que requiere de un delegado que reciba por parámetro el tipo de elemento consultado y que devuelva un bool, de esa forma internamente se va llamando a este por cada elemento y se comprueba lo deseado. | ||
| + | <code csharp> | ||
| + | public IList<Pilot> GetThePilot (Pilot templatePilot) | ||
| + | { | ||
| + | IList<Pilot> pilots = db.Query<Pilot> ( | ||
| + | delegate(Pilot match) | ||
| + | { | ||
| + | return ((match.name == templatePilot.name) && (match.id == templatePilot.id)) | ||
| + | } ); | ||
| + | return pilots; | ||
| + | } | ||
| + | </code> | ||
| === Queries con LINQ === | === Queries con LINQ === | ||
| Línea 78: | Línea 95: | ||
| <code csharp> | <code csharp> | ||
| var result = from p in db.Query<Pilot>() | var result = from p in db.Query<Pilot>() | ||
| - | from c in pilot.lCars | + | from c in p.lCars |
| where (c.marca == "MINI") | where (c.marca == "MINI") | ||
| - | order by p.lCars.Count | + | orderby p.lCars.Count |
| select p; | select p; | ||
| foreach (var r in result) | foreach (var r in result) | ||
| System.Console.WriteLine(r.name); | System.Console.WriteLine(r.name); | ||
| + | </code> | ||
| + | |||
| + | === Notas === | ||
| + | * Para tipar el resultado: | ||
| + | <code csharp> | ||
| + | var template = new Car () { marca = null }; | ||
| + | var result = db.Get(template).Cast<Car>(); | ||
| + | var first = result.FirstOrDefault(); | ||
| + | var list = result.ToList(); | ||
| + | </code> | ||
| + | |||
| + | ==== Acciones básicas ==== | ||
| + | <code csharp> | ||
| + | class Pilot | ||
| + | { | ||
| + | public int id {get; set; } | ||
| + | public string name {get; set;} | ||
| + | public List<Car> lCars = new List<Car>(); | ||
| + | } | ||
| + | class Car | ||
| + | { | ||
| + | public string marca; | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | === Insertar === | ||
| + | Para insertar un elemento llamaremos al método ''Set'': | ||
| + | <code csharp> | ||
| + | db.Set(new Pilot () { id = 1, name = "Juan" }); | ||
| + | </code> | ||
| + | Si un objeto insertado tiene otros objetos internamente (como por ejemplo la clase ''Pilot'' que tiene una lista de la ''Car'') aparecerá en la base de datos otra "tabla" con los objetos, por ejemplo objetos ''Car'' de los ''Pilot'' que se van insertando. \\ | ||
| + | Si en el código se ha asignado un mismo ''Car'' a varios ''Pilot'' no se duplicará en la tabla de la clase ''Car''. \\ | ||
| + | Al eliminar objetos ''Pilot'' no se eliminarán los ''Car'' en la tabla. | ||
| + | |||
| + | === Actualizar === | ||
| + | Para actualizar un elemento símplemente tenemos que recoger lo que queramos actualizar, cambiarlo y volver a colocarlo en la DB llamando al método ''Set''. \\ | ||
| + | La siguiente consulta recoge todos los pilotos con un coche "mini" y actualiza sus nombres agregandoles "minimalistas". | ||
| + | <code csharp> | ||
| + | IObjectContainer db = Db4oFactory.OpenFile("prueba.db"); | ||
| + | var result = from p in db.Query<Pilot>() | ||
| + | from c in p.lCars | ||
| + | where (c.marca == "MINI") | ||
| + | select p; | ||
| + | foreach (var r in result) | ||
| + | { | ||
| + | r.name = r.name + " - Minimalistas"; | ||
| + | db.Set(r); | ||
| + | } | ||
| + | db.Close(); | ||
| + | </code> | ||
| + | === Eliminar === | ||
| + | Eliminar funciona igual que actualizar, únicamente cambia la llamada al método de la DB, esta vez el método es ''Delete''. \\ | ||
| + | El siguiente código elimina todos los pilotos que tengan un mini: | ||
| + | <code chsarp> | ||
| + | var result = from p in db.Query<Pilot>() | ||
| + | from c in p.lCars | ||
| + | where c.marca == "MINI" | ||
| + | select p; | ||
| + | foreach (var r in result) | ||
| + | db.Delete(r); | ||
| + | </code> | ||
| + | |||
| + | |||
| + | ==== Acciones avanzadas ==== | ||
| + | === Generación de IDs === | ||
| + | ''db4o'' por defecto genera un identificador ''long'' para cada objeto insertado en la DB. \\ | ||
| + | Para coger la id de un objeto haremos: ''db.Ext().GetID(object);'' \\ | ||
| + | Para coger un objeto a partir de su id haremos: ''db.Ext().GetByID(id);'' \\ \\ | ||
| + | Opcionalmente también se pueden generar los UUID (//Unique Universal IDs//), que son identificadores universales para que elementos que se compartan entre diferentes DB. | ||
| + | |||
| + | |||
| + | |||
| + | === Indexar un campo === | ||
| + | Para crear un índice deberemos de poner la siguiente línia **antes de abrir la base de datos**: | ||
| + | <code csharp> | ||
| + | Db4oFactory.Configure().ObjectClass(typeof(NombreClase)).ObjectField("NombreCampo").Indexed(true); | ||
| + | </code> | ||
| + | El campo que queramos indexar **no puede ser un campo autoimplementado**, es decir, que sea así: | ||
| + | <code csharp> | ||
| + | int id { get; set; } | ||
| + | </code> | ||
| + | Sería algo así: | ||
| + | <code csharp> | ||
| + | class Program | ||
| + | { | ||
| + | public int id; | ||
| + | public int name; | ||
| + | static void Main(string[] args) | ||
| + | { | ||
| + | Db4oFactory.Configure().ObjectClass(typeof(Program)).ObjectField("id").Indexed(true); | ||
| + | var db = Db4oFactory.OpenFile("c:\\prueba.db"); | ||
| + | ... | ||
| + | </code> | ||
| + | |||
| + | ==== Creación de servidor ==== | ||
| + | === Embedded === | ||
| + | Para usar accesos concurrentes desde un mismo ejecutable: | ||
| + | <code csharp> | ||
| + | IObjectServer server = Db4oFactory.OpenServer(dbPath, 0); | ||
| + | IObjectContainer client1 = server.OpenClient(); | ||
| + | IObjectContainer client2 = server.OpenClient(); | ||
| + | // ... | ||
| + | client1.Close(); | ||
| + | client2.Close(); | ||
| + | server.Close(); | ||
| + | </code> | ||
| + | === En red === | ||
| + | Para que funcione en red, el servidor: | ||
| + | <code csharp> | ||
| + | public void Start() | ||
| + | { | ||
| + | lock (this) | ||
| + | { | ||
| + | IObjectServer server = Db4oFactory.OpenServer("c:\\db.db4o", 1258); | ||
| + | server.GrantAccess(USER, PASSWORD); | ||
| + | Monitor.Wait(this); | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | Y el cliente: | ||
| + | <code csharp> | ||
| + | IObjectContainer db = Db4oFactory.OpenClient(SERVER_HOST, 1258, USER, PASSWORD); | ||
| </code> | </code> | ||