Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Пример базы данных

From Wiki
Jump to: navigation, search
Article Metadata

Статья
Перевод:
Оригинал: Database Example
truf
Последнее редактирование: hamishwillee (09 Dec 2011)

Класс 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;
};
This page was last modified on 9 December 2011, at 02:06.
273 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×