新手,持久化存储问题,附代码,帮忙看下

LZHWWY 2007-09-06 10:31:16
本人想试着写个课程表的程序,其中想利用CEikDocument::ReStoreL()和StoreL()的方法来对课表进行存取,不过不太明白这两个函数如何使用,看参数貌似必须用到字典流,可是我自定义的课表类中并没有用到字典流。高手指点!如果类设计有什么问题,也请指出!

class TCourseInfo
{
public:
TCourseInfo();
TCourseInfo(TDesC& aName,TDesC& aAddr,TDesC& aTeacher,TInt aTime,TInt aBeginWeek,TInt aEndWeek);
void ExternalizeL(RWriteStream& aStream) const;
void InternalizeL(RReadStream& aStream);
/*
TInt operator>(const TCourseInfo& aCourseInfo);
TInt operator<(const TCourseInfo& aCourseInfo);*/
TBool operator==(const TCourseInfo& aCourseInfo);

private:
TBuf<128> iName;
TBuf<128> iAddr;
TBuf<128> iTeacher;
enum
{
At1_2,
At3_4,
At5_6,
At7_8,
At9_10
}iTime;
TInt iBeginWeek;
TInt iEndWeek;
};

TCourseInfo::TCourseInfo()
{
}

TCourseInfo::TCourseInfo(TDesC& aName,TDesC& aAddr,TDesC& aTeacher,TInt aTime,TInt aBeginWeek,TInt aEndWeek)
{
iName = aName;
iAddr = aAddr;
iTeacher = aTeacher;
iTime = aTime;
iBeginWeek = aBeginweek;
iEndWeek = aEndWeek;
}

void TCourseInfo::ExternalizeL(RWriteStream& aStream) const
{
aStream<<iName;
aStream<<iAddr;
aStream<<iTeacher;
aStream.WriteInt32L(iTime);
aStream.WriteInt32L(iBeginWeek);
aStream.WriteInt32L(iEndWeek);
}

void TCourseInfo::InternalizeL(RReadStream& aStream)
{
aStream>>iName;
aStream>>iAddr;
aStream>>iTeacher;
iTime = aStream.ReadInt32L();
iBeginWeek = aStream.ReadInt32L();
iEndWeek = aStream.ReadInt32L();
}

TBool TCourseInfo::operator==(const TCourseInfo& aCourseInfo)
{
if(!iName.Compare(aCourseInfo.iName) && !iAddr.Compare(aCourseInfo.iAddr) && !iTeacher.Compare(aCourseInfo.iTeacher)
&& iTime == aCourseInfo.iTime && iBeginWeek == aCourseInfo.iBeginWeek && iEndWeek == iBeginWeek.iEndWeek)
return ETure;
else return EFalse;
}







class CSyllabusDB : public CBase
{
public:
static CSyllabusDB* NewL();
static CSyllabusDB* NewLC();

void SaveToFileL();
void ReadFromFileL();
TBool AddToArray(const TCourseInfo& aCourseInfo);
TBool DelACourse(const TCourseInfo& aCourseInfo);
void DelAll();/////////////////////////////////////?????????????????????????????????????没写呢!!!!!
TBool GetArrayStatus();//数组是否被修改,是:程序推出时要将Array写入文件;否:直接退出
~CClassScheduleDB();


private:
CClassScheduleDB();
void ConstructL();

private:
CArrayFixFlat<TCourseInfo>* iCoursesArray;
TBool iChanged;
RFs iFs;
};

CSyllabusDB::CSyllabusDB()
{
iChanged = EFalse;
}

CSyllabusDB::~CSyllabusDB()/////////////////////////////////////////////
{
iFs.Close();
}

CSyllabusDB* CSyllabusDB::NewL()
{
CSyllabusDB* self = CSyllabusDB::NewLC();
CleanupStack::Pop();
return self;
}

CSyllabusDB* CSyllabusDB::NewLC()
{
CSyllabusDB* self = new (ELeave) CSyllabusDB();
CleanupStack::PushL(self);
self->ConstructL();
return self;
}

void CSyllabusDB::ConstructL()
{
iCoursesArray = new(ELeave) CArrayFixFlat<TCourseInfo>(20);
User::LeaveIfError(iFs.Connect());
iFs.MkDirAll(KFileStoreDir);
}

void CSyllabusDB::SaveToFileL(TDesC& aFileName)
{
TParse parsedName;
iFs.Parse(aFileName,parsedName);

CFileStore* store = CDirectFileStore::ReplaceLC(iFs,parseName.FullName(),EFileWrite);
store->SetTypeL(KDirectFileStoreLayoutUid);

RStoreWriteStream stream;
TStreamId id = stream.CreateLC(*store);

TInt count = iCoursesArray->Count();
stream.WriteInt32L(count);

TInt i;
for(i = 0; i < count ; i++)
{
stream<<iCoursesArray->At(i);
}
Steam.CommitL();
CleanupStack::PopAndDestory();

store->SetRootL(id);
store->CommitL();
CleanupStack::PopAndDestroy();
}

void CSyllabusDB::ReadFromFileL(TDesC& aFileName)
{
TParse parsedName;
iFs.Parse(aFileName,parsedName);

CFileStore* store = CDirectFileStore::OpenLC(iFs,parseName.FullName(),EFileRead);
store->SetTypeL(KDirectFileStoreLayoutUid);

RStoreReadStream stream;
TStreamId id = stream.OpenLC(*store);

TInt count = stream.ReadInt32L();

TInt i;
for(i = 0; i < count ; i++)
{
stream >> iCoursesArray->At(i);
}
CleanupStack::PopAndDestory(2);//store,stream
//return 0;
}

TBool CSyllabusDB::AddToArray(const TCourseInfo& aCourseInfo)
{
TInt i;
for(i = 0; i < iCoursesArray->Count();i++)
{
if(aCourseInfo == iCoursesArray->At(i))
return EFalse;
}
iCoursesArray->AppendL(aCourseInfo);
return ETure;
}

TBool CSyllabusDB::DelACourse(const TCourseInfo& aCourseInfo)
{
TInt i;
for(i = 0; i < iCoursesArray->Count();i++)
{
if(aCourseInfo == iCoursesArray->At(i))
{
iCoursesArray->Delete(i);
return ETrue;
}
}
return EFalse;
}
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LZHWWY 2007-09-09
  • 打赏
  • 举报
回复
谢谢,dyw的指点和鼓励!呵呵

我看了下哪个例子,确实收获不少。不过,我写的这个程序用的avkon模式,似乎和例程还有些不同,还在体会中。。。。

我现在手头上的参考书是《Seriers 60 应用程序开发》,这本书不错,不过有关持久化的东西讲的不多,请问有没有好一点的书,推荐下!!

dyw 2007-09-07
  • 打赏
  • 举报
回复
另外,如果记录多,可以使用EDBMS。
dyw 2007-09-07
  • 打赏
  • 举报
回复
参考这个:
C:\Symbian\9.2\S60_3rd_FP1\S60Ex\GuiEngine

实际上,你做的这个也不错。
LZHWWY 2007-09-06
  • 打赏
  • 举报
回复
class TCourseInfo
{
public:
TCourseInfo();
TCourseInfo(TDesC& aName,TDesC& aAddr,TDesC& aTeacher,TInt aTime,TInt aBeginWeek,TInt aEndWeek);
void ExternalizeL(RWriteStream& aStream) const;
void InternalizeL(RReadStream& aStream);
/*
TInt operator>(const TCourseInfo& aCourseInfo);
TInt operator<(const TCourseInfo& aCourseInfo);*/
TBool operator==(const TCourseInfo& aCourseInfo);

private:
TBuf<128> iName;
TBuf<128> iAddr;
TBuf<128> iTeacher;
enum
{
At1_2,
At3_4,
At5_6,
At7_8,
At9_10
}iTime;
TInt iBeginWeek;
TInt iEndWeek;
};

TCourseInfo::TCourseInfo()
{
}

TCourseInfo::TCourseInfo(TDesC& aName,TDesC& aAddr,TDesC& aTeacher,TInt aTime,TInt aBeginWeek,TInt aEndWeek)
{
iName = aName;
iAddr = aAddr;
iTeacher = aTeacher;
iTime = aTime;
iBeginWeek = aBeginweek;
iEndWeek = aEndWeek;
}

void TCourseInfo::ExternalizeL(RWriteStream& aStream) const
{
aStream<<iName;
aStream<<iAddr;
aStream<<iTeacher;
aStream.WriteInt32L(iTime);
aStream.WriteInt32L(iBeginWeek);
aStream.WriteInt32L(iEndWeek);
}

void TCourseInfo::InternalizeL(RReadStream& aStream)
{
aStream>>iName;
aStream>>iAddr;
aStream>>iTeacher;
iTime = aStream.ReadInt32L();
iBeginWeek = aStream.ReadInt32L();
iEndWeek = aStream.ReadInt32L();
}

TBool TCourseInfo::operator==(const TCourseInfo& aCourseInfo)
{
if(!iName.Compare(aCourseInfo.iName) && !iAddr.Compare(aCourseInfo.iAddr) && !iTeacher.Compare(aCourseInfo.iTeacher)
&& iTime == aCourseInfo.iTime && iBeginWeek == aCourseInfo.iBeginWeek && iEndWeek == iBeginWeek.iEndWeek)
return ETure;
else return EFalse;
}







class CSyllabusDB : public CBase
{
public:
static CSyllabusDB* NewL();
static CSyllabusDB* NewLC();

void SaveToFileL();
void ReadFromFileL();
TBool AddToArray(const TCourseInfo& aCourseInfo);
TBool DelACourse(const TCourseInfo& aCourseInfo);
void DelAll();/////////////////////////////////////?????????????????????????????????????没写呢!!!!!
TBool GetArrayStatus();//数组是否被修改,是:程序推出时要将Array写入文件;否:直接退出
~CClassScheduleDB();


private:
CClassScheduleDB();
void ConstructL();

private:
CArrayFixFlat<TCourseInfo>* iCoursesArray;
TBool iChanged;
RFs iFs;
};

CSyllabusDB::CSyllabusDB()
{
iChanged = EFalse;
}

CSyllabusDB::~CSyllabusDB()/////////////////////////////////////////////
{
iFs.Close();
}

CSyllabusDB* CSyllabusDB::NewL()
{
CSyllabusDB* self = CSyllabusDB::NewLC();
CleanupStack::Pop();
return self;
}

CSyllabusDB* CSyllabusDB::NewLC()
{
CSyllabusDB* self = new (ELeave) CSyllabusDB();
CleanupStack::PushL(self);
self->ConstructL();
return self;
}

void CSyllabusDB::ConstructL()
{
iCoursesArray = new(ELeave) CArrayFixFlat<TCourseInfo>(20);
User::LeaveIfError(iFs.Connect());
iFs.MkDirAll(KFileStoreDir);
}

void CSyllabusDB::SaveToFileL(TDesC& aFileName)
{
TParse parsedName;
iFs.Parse(aFileName,parsedName);

CFileStore* store = CDirectFileStore::ReplaceLC(iFs,parseName.FullName(),EFileWrite);
store->SetTypeL(KDirectFileStoreLayoutUid);

RStoreWriteStream stream;
TStreamId id = stream.CreateLC(*store);

TInt count = iCoursesArray->Count();
stream.WriteInt32L(count);

TInt i;
for(i = 0; i < count ; i++)
{
stream<<iCoursesArray->At(i);
}
Steam.CommitL();
CleanupStack::PopAndDestory();

store->SetRootL(id);
store->CommitL();
CleanupStack::PopAndDestroy();
}

void CSyllabusDB::ReadFromFileL(TDesC& aFileName)
{
TParse parsedName;
iFs.Parse(aFileName,parsedName);

CFileStore* store = CDirectFileStore::OpenLC(iFs,parseName.FullName(),EFileRead);
store->SetTypeL(KDirectFileStoreLayoutUid);

RStoreReadStream stream;
TStreamId id = stream.OpenLC(*store);

TInt count = stream.ReadInt32L();

TInt i;
for(i = 0; i < count ; i++)
{
stream >> iCoursesArray->At(i);
}
CleanupStack::PopAndDestory(2);//store,stream
//return 0;
}

TBool CSyllabusDB::AddToArray(const TCourseInfo& aCourseInfo)
{
TInt i;
for(i = 0; i < iCoursesArray->Count();i++)
{
if(aCourseInfo == iCoursesArray->At(i))
return EFalse;
}
iCoursesArray->AppendL(aCourseInfo);
return ETure;
}

TBool CSyllabusDB::DelACourse(const TCourseInfo& aCourseInfo)
{
TInt i;
for(i = 0; i < iCoursesArray->Count();i++)
{
if(aCourseInfo == iCoursesArray->At(i))
{
iCoursesArray->Delete(i);
return ETrue;
}
}
return EFalse;
}

3,119

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧