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();
此文为开发视界翻译转载者请注明出处否则追究法律责任
|