Limitations
The good news is that the Symbian DBMS implementation has a tiny footprint. In spite of the tiny footprint, important features such as the ability to build and maintain multiple indexes on tables are supported. The bad news is there are some major limitations that go along with that. Probably the biggest is the lack of support for joins. If you need joins, use one of the third-party implementations, being aware of the larger footprint that entails. However, for many mobile applications, the EDBMS component actually suffices. For example, the SymbianOS communications database uses the EDBMS component. In addition to internal system databases, however, the EDBMS component is also available to third-party developers.
RDbNamedDatbase: Using the DBMS Server
To access the database server, use the RDbNamedDatabase class. This is the most common approach, and allows multiple readers/writers to connect to the same database. SymbianOS, a sophisticated operating system, fully supports preemptive multithreading, and it is not uncommon for multiple writers to want to access the same database. RDbStoreDatabase is less commonly used; it bypasses the DBMS server which is slight benefit in terms of not having the additional DBMS server layer. However, the DBMS server layer provides multi-user benefits.
Thus applications using RDbStoreDatabase only allow one writer at a time to have a particular database open. Another benefit of the less-used RDbStoreDatabase is that that class provides for the storing of other data besides tables in the same file as the database tables. Listing One is an example use of RDbNamedDatbase which lists the tables in a database.
// tables.cpp // #include "eustd.h" #include <d32dbms.h> _LIT(KFile,"c:\\mydatabase.cdb"); // Simple console program to list tables in a database LOCAL_C void doExampleL() { TInt i; // handle into the DBMS server RDbs myDbs; // handle for our database RDbNamedDatabase myDatabase; // we have to connect to the DBMS server first User::LeaveIfError( myDbs.Connect()); //handles use the cleanup stack CleanupClosePushL(myDbs); // Open the contacts database using the default format User::LeaveIfError( myDatabase.Open(myDbs,KFile,_L("")) ); //handles use the cleanup stack CleanupClosePushL(myDatabase); CDbTableNames* myTableNames; TInt numTables = 0; // retrieve a list of tables in the contacts database myTableNames = myDatabase.TableNamesL(); numTables = myTableNames->Count(); for ( i = 0 ; i < numTables; i++) { console->Printf( (*myTableNames)[i]); console->Printf(_L("\n")); } // pause so the console can be seen console->Getch(); // DBMS connection and database handles must be closed CleanupStack::PopAndDestroy(2); delete myTableNames; }// end doExampleL