Let’s have a look at the code in DataStore class (in the core).
/**
* Deletes the given object and returns the object if successful
* @param The object to be deleted
* @return The object being deleted
*/
public <T> T delete(T aTNG){
// Please see Wiki for more information on the ServerConfiguration.
ClientConfiguration config = Db4oClientServer.newClientConfiguration();
config.common().reflectWith(new JdkReflector(Thread.currentThread().getContextClassLoader()));
logger.log(Level.FINE, "Database Delete Attempt...");
//ObjectContainer client = server.openClient();
ObjectSet<T> result = theDB.queryByExample(aTNG);
T found = (T) result.next(); //<--- will send out exception:java.lang.IllegalStateException
//if "result" is empty.
theDB.delete(found);
theDB.commit();
logger.log(Level.FINE, "Database Delete Success!");
//return "Deleted "+aTNG;
return found;
}
Problem Analysis
In this term, many groups used Calendar object to store date information. However, it seems that calendar (or say GregorianCalendar) cannot be parsed and compared in db4o database. This makes queryByExample()
method cannot locate the data we find. So if we pass a commitment, which we want to delete from the database, to this method ObjectSet<T> result = theDB.queryByExample(aTNG);
, it cannot find the one in the database and return an empty result collection. Then when we use .next()
method on an empty collection, we will get errors. This is the reason why we pass the thing we want to delete to the database, and the database can’t delete it and give us an error.
Solution
Since CalendarItem has a unique id, we just make a null CalendarItem (e.g. CalendarItem(null,null,null)
) and set its id to the one we want to delete, and pass it to the delete method in the DataStore.
Example:
public boolean deleteEntity(Session s, String id) throws WPISuiteException{
ensureRole(s, Role.ADMIN);
Commitment oldComm = new Commitment(null,null,null);
oldComm.setId(Integer.parseInt(id));
Commitment deletedComm = db.delete(oldComm);
if (deletedComm != null){
System.out.println("Here is deletEntity method. ---> delete Successful");
return true; // the deletion was successful
}
System.out.println("Here is deletEntity method. ---> delete Fail");
return false; // The deletion was unsuccessful
}
Details
queryByExample
is the same asget()
(deprecated) method in the db4o.
Reference: http://www.db4o.com/about/productinformation/resources/db4o-6.3-tutorial-java.pdf