S60平台:使用DBMS APIs —DBMS的管理结构和元素(4)
2.6 创建数据
一旦数据库打开,就可以在数据库中保存数据。需要指出的是,无需为添加和取回数据定义索引。
下列代码段展示了表方法(参见3.1.2节,“表行集”)是如何向2.3节创建的表,“用数据库定义表”中插入数据的。本例中假定数据库是开启的。
...
_LIT(KBooksTable, "Books");
_LIT(KBooksAuthorCol, "Author");
_LIT(KBooksTitleCol, "Title");
_LIT(KBooksDescriptionCol, "Description");
...
private: //数据成员
RDbStoreDatabase iBookDb;
...
void CBookDb::AddBookWithCppApiL(const TDesC& aAuthor, const TDesC& aTitle, const TDesC& aDescription)
{
// 创建一个更新表数据库对象,假定数据库开启.
RDbTable table;
User::LeaveIfError(table.Open(iBookDb,KBooksTable, table.EUpdatable));
CleanupClosePushL(table); // 记忆弹出与关闭
//建立 CdbColSet,使用其查询列成员
CDbColSet* booksColSet = table.ColSetL();
CleanupStack::PushL(booksColSet);
table.Reset();
table.InsertL(); // 插入空行
//为每一行设定作者与名称
table.SetColL(booksColSet->ColNo(KBooksAuthorCol), aAuthor);
table.SetColL(booksColSet->ColNo(KBooksTitleCol), aTitle);
//设定说明。使用长列流
RDbColWriteStream writeStream;
writeStream.OpenLC(table, booksColSet->ColNo(KBooksDescriptionCol));
writeStream.WriteL(aDescription);
writeStream.Close();
CleanupStack::Pop(); // 写流
CleanupStack::PopAndDestroy(booksColSet);
table.PutL(); // 完成插入
CleanupStack::Pop() // 表
table.Close();
}
Books表首先以更细模式打开。booksColSet在寻找列成员——作者列,名称列,说明列时初始化。
为数据库添加一个新行包括:首先插入一个空行,更新行值,最后完成对数据库的插入。table.SetCol(…)设定了作者与名称。说明列比较长,需要使用RDbColWriteStream。像获
得更多长文本列的信息,可以参考2.6.1节,“数据库中的长列数据”。其创建工作由PutL()完成。最后,表被关闭。
2.6.1 数据库中的长列数据
通过使用RDbColReadStream,可以获取带有一个EDbColLongText DBMS列的文本数据;相似地,RDbCoWriteStream被用来为行集设定其列类型的内容。
对流式读取来说,Symbian系统的DBMS在同一时刻仅支持行集内的一个列。当流打开时,在同一个行集对象中不能使用RDbColWriteStream来定义列。
...
_LIT(KBooksTable, "Books");
_LIT(KBooksDescriptionCol, "Description");
...
private: //数据成员
RDbStoreDatabase iBookDb;
...
TBuf<128> description; // 读结果并放置于此
RDbTable table;
User::LeaveIfError(table.Open(iBookDb, KBooksTable, table.EReadOnly));
table.Reset();
// 找到“说明”列的列数量
CDbColSet* colSet = table.ColSetL();
TDbColNo descrColNo = colSet->ColNo(KBooksDescriptionCol);
delete colSet;
table.FirstL(); // 为第一行设定游标,检查是否成功
table.GetL(); // 获取第一行的操作
// 读所有的字母,确定没有128个字母的
RDbColReadStream readStream;
readStream.OpenLC(table, descrColNo);
readStream.ReadL(description, table.ColLength(descrColNo));
readStream.Close();
CleanupStack::Pop(); //读流
CleanupStack::PopAndDestroy(colSet);
table.Close();
...
长列数据通常使用RDbColWriteStream来添加或更新。(完整的插入长列数据代码可从2.6小节,“创建数据”获得)。
RDbTable table;
// Open table in updatable mode
User::LeaveIfError(table.Open(iBookDb, KBooksTable, table.EUpdatable);
CDbColSet* booksColSet = table.ColSetL();
CleanupStack::PushL(booksColSet);
...
// Find or create a row here and retrieve it for operation
// Use a stream to read data from the long column
RDbColWriteStream writeStream;
writeStream.OpenLC(table,
booksColSet->ColNo(KBooksDescriptionCol));
writeStream.WriteL(aDescription);
writeStream.Close();
CleanupStack::Pop(); // writeStream
...
CleanupStack::PopAndDestroy(booksColSet);
table.Close();
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。