This page was last modified 08:32, 28 October 2007.
Пример базы данных
From Forum Nokia Wiki
Перевод с английского, оригинальная статья находится здесь.
Класс CMyDBClass демонстрирует использование RDbNamedDatabase API в вашем приложении. Этот пример сделан для S60 3-й редакции, но если вы хотите использовать его в более старых версиях, просто замените RFs::PrivatePath() константой, содержащей путь к файлу.
Как показано в конструкторе, база данных открывается, если файл базы данных существует, или создается заново в противном случае. Что бы изменить базу данных в соответствии с вашими требованиями, просто поменяйте определения таблиц в методе CreateTableL(). И не забудьте внести соответствующие изменения в остальные функции.
NamedDataBase.cpp
CMyDBClass::~CMyDBClass() { iItemsDatabase.Close(); iFsSession.Close(); } void CMyDBClass::ConstructL() { User::LeaveIfError(iFsSession.Connect()); TFileName DBFileName; // путь к папке private программы (без диска) iFsSession.PrivatePath(DBFileName); TFindFile PrivFolder(iFsSession); // ищем папку на всех дисках if(KErrNone == PrivFolder.FindByDir(DBFileName, KNullDesC)) { DBFileName.Copy(PrivFolder.File()); DBFileName.Append(KtxDatabaseName); if(BaflUtils::FileExists(iFsSession, DBFileName)) { User::LeaveIfError(iItemsDatabase.Open(iFsSession, DBFileName)); ReadDbItemsL(); } else { // базы не существует - создадим новую User::LeaveIfError(iItemsDatabase.Create(iFsSession, DBFileName)); // и создадим в ней необходимые таблицы CreateTableL(iItemsDatabase); } } } void CMyDBClass::CreateTableL(RDbDatabase& aDatabase) { // Множество столбцов - хранит описания столбцов таблицы CDbColSet* columns=CDbColSet::NewLC(); // Добавим столбец TDbCol id(NCol0,EDbColInt32); // Автоматическая индексация, это наш ключ таблицы. id.iAttributes=id.EAutoIncrement; columns->AddL(id); columns->AddL(TDbCol(NCol1, EDbColText,100)); columns->AddL(TDbCol(NCol2, EDbColText,100)); // Создаем таблицу User::LeaveIfError(aDatabase.CreateTable(KtxtItemlist, *columns)); // Уничтожим множество столбцов CleanupStack::PopAndDestroy(); } void CMyDBClass::ReadDbItemsL(RArray<TExampleItem>& aItemArray) { aItemArray.Reset();// Очистим массив TFileName QueryBuffer; // Извлекаем все данных для всех столбцов QueryBuffer.Copy(_L("SELECT * FROM ")); QueryBuffer.Append(KtxtItemlist); RDbView Myview; Myview.Prepare(iItemsDatabase,TDbQuery(QueryBuffer)); CleanupClosePushL(Myview); Myview.EvaluateAll(); Myview.FirstL(); // Считываем полученные данные в массив while(Myview.AtRow()) { Myview.GetL(); TExampleItem NewItem; NewItem.iIndex = Myview.ColInt(1); NewItem.iName.Copy(Myview.ColDes(2)); NewItem.iValue.Copy(Myview.ColDes(3)); aItemArray.Append(NewItem); Myview.NextL(); } CleanupStack::PopAndDestroy(1); // Myview } void CMyDBClass::DeleteFromDatabaseL(TInt& aIndex) { TFileName QueryBuffer; QueryBuffer.Copy(_L("SELECT * FROM ")); QueryBuffer.Append(KtxtItemlist); QueryBuffer.Append(_L(" WHERE ")); QueryBuffer.Append(NCol0); QueryBuffer.Append(_L(" = ")); QueryBuffer.AppendNum(aIndex); iItemsDatabase.Begin(); RDbView Myview; // Запрос с индексом вырнет только данные выбранной записи. Myview.Prepare(iItemsDatabase,TDbQuery(QueryBuffer)); CleanupClosePushL(Myview); Myview.EvaluateAll(); Myview.FirstL(); // мы используем autoincrement в качестве ключа, // и он должен быть уникальным, // но на всякий случай воспользуемся 'while' вместо 'if' while(Myview.AtRow()) { Myview.GetL(); Myview.DeleteL(); Myview.NextL(); } CleanupStack::PopAndDestroy(1); // Myview iItemsDatabase.Commit(); // compacts the databse, by physicaly removig deleted data. iItemsDatabase.Compact(); } void CMyDBClass::UpdateDatabaseL(const TDesC& aName, const TDesC& aValue, TInt& aIndex) { TFileName QueryBuffer; QueryBuffer.Copy(_L("SELECT * FROM ")); QueryBuffer.Append(KtxtItemlist); QueryBuffer.Append(_L(" WHERE ")); QueryBuffer.Append(NCol0); QueryBuffer.Append(_L(" = ")); QueryBuffer.AppendNum(aIndex); iItemsDatabase.Begin(); RDbView Myview; Myview.Prepare(iItemsDatabase, TDbQuery(QueryBuffer)); CleanupClosePushL(Myview); Myview.EvaluateAll(); Myview.FirstL(); if(Myview.AtRow()) { Myview.UpdateL(); Myview.SetColL(2, aName); Myview.SetColL(3, aValue); Myview.PutL(); } CleanupStack::PopAndDestroy(1); // Myview iItemsDatabase.Commit(); } void CMyDBClass::SaveToDatabaseL(const TDesC& aName, const TDesC& aValue, TInt& aIndex) { TFileName QueryBuffer; QueryBuffer.Copy(_L("SELECT * FROM ")); QueryBuffer.Append(KtxtItemlist); iItemsDatabase.Begin(); RDbView Myview; Myview.Prepare(iItemsDatabase, TDbQuery(QueryBuffer)); CleanupClosePushL(Myview); Myview.InsertL(); Myview.SetColL(2, aName); Myview.SetColL(3, aValue); Myview.PutL(); aIndex = Myview.ColInt(1);// autoincrement дает уникальный индекс. CleanupStack::PopAndDestroy(1); // Myview iItemsDatabase.Commit(); }
NamedDataBase.h
//имя базы данных _LIT(KtxDatabaseName, "Items.db"); // имена столбцов _LIT(NCol0, "index"); _LIT(NCol1, "name"); _LIT(NCol2, "value"); // имя таблицы _LIT(KtxtItemlist, "itemlist"); class TExampleItem { public: TExampleItem(): iIndex(-1){}; public: TInt iIndex; TBuf<100> iName, iValue; }; class CMyDBClass : public CBase { public : void ConstructL(); ~CMyDBClass(); public: void DeleteFromDatabaseL(TInt& aIndex); void UpdateDatabaseL(const TDesC& aName, const TDesC& aValue, TInt& aIndex); void SaveToDatabaseL(const TDesC& aName, const TDesC& aValue, TInt& aIndex); void ReadDbItemsL(RArray<TExampleItem>& aItemArray); private: void CreateTableL(RDbDatabase& aDatabase); private: RDbNamedDatabase iItemsDatabase; RFs iFsSession; };
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Делаем основной цикл игры | Ecconaut | Russian Developer Forum - Форум Российских разработчиков | 17 | 2007-12-12 04:32 |
| CAknView | b_monkey | Russian Developer Forum - Форум Российских разработчиков | 7 | 2007-12-04 12:12 |
| NokiaCLFileTransfer | soumi | Russian Developer Forum - Форум Российских разработчиков | 3 | 2008-07-02 09:50 |
| Отслеживание событий журнала звонков | Den123 | Russian Developer Forum - Форум Российских разработчиков | 2 | 2008-03-11 06:09 |
| samsung & symbian sdk | spirt | Russian Developer Forum - Форум Российских разработчиков | 7 | 2008-05-01 10:35 |
