Scott Erickson wrote:
Bob,
Here is what I got at this point. Is this pretty much what I need to do to read through all dbs on the device?
Here's a function that I use to build a list of databases in one of my apps. I haven't really typed this out all that well, but it should give some ideas.
First I initialize the 2 variables, then call BuildDBList() with the type of db that I am looking for. Note that this ONLY looks for dbs created by my app, so the CreatorID is hardcoded as RPNAppID. Using NULL here would search for all creators. Once the list has been created in memory, it is really easy to refer to it; see the bit of code at the bottom.
//these are globals that I can access from any part of my app MemHandle dbListH=NULL; UInt16 gLockCount=0;
//this defines the structure for dbList
typedef struct {
UInt16 card;
LocalID currentDB;
UInt16 other;
} myDbListType;//this function builds the list. I do this once, and only again when I detect that a change has been made.
void BuildDBList(UInt32 type)
//type could be NULL if you want to search for ALL types.
{
DmSearchStateType state;
Boolean latestVer=false; //this is usually false for apps
UInt16 card;
LocalID currentDB=0;
UInt16 attributesP;
UInt16 count=0;
UInt16 maxCount=10;
Err Error;
Char dbName[32];
LocalID appInfoIDP;
Char *ch=(void*)&type;
myDbListType *dbListP;
//initialize memory for dblist
if (dbListH){
MemHandleFree(dbListH);
dbListH=NULL;
}
dbListH=MemHandleNew(maxCount*sizeof(myDbListType));
dbListP=myMemHandleLock(dbListH);Error = DmGetNextDatabaseByTypeCreator(true, &state, type, RPNAppID, latestVer, &card, ¤tDB);
//Build list of names
while (!Error && currentDB && count<256) {
Error = DmDatabaseInfo(card, currentDB, dbName,&attributesP,NULL,NULL,NULL,NULL,NULL,&appInfoIDP,NULL,NULL,NULL);
if (StrNCompare(ch+1,dbName+4,3)==0){
//grow the list if necessary
if (count==maxCount){
Err err;
maxCount+=10;
myMemPtrUnlock(dbListP);
err=MemHandleResize(dbListH,maxCount*sizeof(myDbListType));
dbListP=myMemHandleLock(dbListH);
if (err){
maxCount-=10;
break;
}
}
//add entry to dbList
dbListP[count].card=card;
dbListP[count].currentDB=currentDB;
if (type=='BPgm'){
DmOpenRef db;
UInt16 key;
db=DmOpenDatabase(card,currentDB,dmModeReadOnly);
GetProgHeader(db, NULL, &key, NULL);
DmCloseDatabase(db);
dbListP[count].other=key;
}
else
dbListP[count].other=0;
count++;
}
Error = DmGetNextDatabaseByTypeCreator(false, &state, type, RPNAppID, latestVer, &card, ¤tDB);
}
dbListCount=count;
SysQSort (dbListP, count, sizeof(myDbListType), myCompareDBNames, 0);
myMemPtrUnlock(dbListP);
}
The list is a list of card numbers and localIDs for databases. With this list in place it is easy to populate a popup list, for instance. If I wanted to find the name of the databases in my list I would do something like this...
{
myDbListType *dbListP;
UInt16 dbIndex=index; //this is the index of the list member that I am interested in
char name[32];
dbListP=myMemHandleLock(dbListH);
DmDatabaseInfo(dbListP[dbIndex].card, dbListP[dbIndex].currentDB, name,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
myMemPtrUnlock(dbListP);
}
When you are done with the list just do MemHandleFree(dbListH) and set dbListCount to 0.
Bob.
-- For information on using the Palm Developer Forums, or to unsubscribe, please see http://www.palmos.com/dev/support/forums/
