Hello, all.
I've got a small problem. I've not been able to get a test
application that I have been writing to write to or read from a database
correctly. I usually end up with garbage. :-) Anyway, this basic
application consists of one form with two text fields and a button.
Basically, I wanted to be able to enter a name and phone number and
cause those values to be saved to a database when the user presses the
button. Simple, right? Sorry for the length, but I wanted to show all of
the relevant code, as an error could literally be anywhere. :-) I have
read through the first ten chapters of _Palm OS Programming: The
Developers Guide, 2nd Edition_. The database chapter (10) has not been a
great help in solving this problem. I have also searched these forums,
but none of the suggestions seem to help. Thank you for any insight you
can provide. Anyway, below is the structure I defined for the database:
typedef struct
{
Char* name; // Hold person's name.
Char* phoneNum; // Hold their phone number.
} DemoDB;
typedef DemoDB* DemoDBPtr;
Following are the relevant functions:
Err GetFromDatabase(DemoDBPtr& dbPtr, MemHandle& infoH, UInt16 index)
{
Err err = 0;
infoH = DmQueryRecord(dbDemo, index);
if(!infoH)
{
infoH = MemHandleNew(sizeof(DemoDB));
dbPtr = (DemoDBPtr)MemHandleLock(infoH);
dbPtr->name = "Robert Brinson";
dbPtr->phoneNum = "479-524-6631";
return err; //err = DmGetLastErr();
}
else
dbPtr = (DemoDBPtr)MemHandleLock(infoH);
return err;
}
Err AddToDatabase(FieldPtr field1, FieldPtr field2)
{
MemHandle a, b;
DemoDBPtr dbPtr;
MemPtr infoP = MemPtrNew(sizeof(DemoDB));
Err error = errNone;
UInt16 recIndex = 0;
dbPtr = (DemoDBPtr)infoP;
a = FldGetTextHandle(field1);
if(a)
dbPtr->name = (Char*)MemHandleLock(a);
else
return DmGetLastErr();
b = FldGetTextHandle(field2);
if(b)
dbPtr->phoneNum = (Char*)MemHandleLock(b);
else
return DmGetLastErr();
MemHandle myRecord = DmNewRecord(dbDemo, &recIndex,
sizeof(DemoDB)+1);
MemPtr demo = MemHandleLock(myRecord);
error = DmWrite(demo, 0, &dbPtr, sizeof(DemoDB)+1);
MemPtrUnlock(demo);
MemHandleUnlock(a);
MemHandleUnlock(b);
DmReleaseRecord(dbDemo, recIndex, true);
return error;
}
Err SetFieldTextFromStr(FieldPtr field, Char *str, Boolean redraw)
{
MemHandle h;
h = FldGetTextHandle(field);
if(h)
{
Err err;
FldSetTextHandle(field, NULL);
err = MemHandleResize(h, StrLen(str) + 1);
if(err != errNone)
{
FldSetTextHandle(field, h); // Restore Handle.
return err;
}
}
else
{
h = MemHandleNew(StrLen(str) + 1);
if(!h)
return memErrNotEnoughSpace;
}
// At this point, we have a handle of the correct size.
// Copy the string to the locked handle.
StrCopy((Char*)MemHandleLock(h), str);
// Unlock the string handle.
MemHandleUnlock(h);
FldSetTextHandle(field, h);
if(redraw)
FldDrawField(field);
return errNone;
}
static void * GetObjectPtr(UInt16 objectID)
{
FormPtr frmP;
frmP = FrmGetActiveForm();
return FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, objectID));
frmP = NULL;
}
static void MainFormInit(FormPtr frmP)
{
#pragma unused(frmP)
Err err;
MemHandle h;
DemoDBPtr dbPtr = NULL;
GetFromDatabase(dbPtr, h, 0);
if(dbPtr)
{
FieldPtr fldNameP =
(FieldPtr)GetObjectPtr(MainFldNameField);
err = SetFieldTextFromStr(fldNameP, dbPtr->name, false);
dbPtr = NULL;
fldNameP = NULL;
}
GetFromDatabase(dbPtr, h, 1);
if(dbPtr)
{
FieldPtr fldPhoneP =
(FieldPtr)GetObjectPtr(MainFldPhoneField);
err = SetFieldTextFromStr(fldPhoneP, dbPtr->phoneNum,
false);
dbPtr = NULL;
fldPhoneP = NULL;
}
MemHandleUnlock(h);
MemHandleFree(h);
}
static Boolean MainFormHandleEvent(EventPtr eventP)
{
Boolean handled = false;
FormPtr frmP;
switch (eventP->eType)
{
// Snipped for brevity.
case frmOpenEvent:
frmP = FrmGetActiveForm();
MainFormInit(frmP);
FrmDrawForm (frmP);
handled = true;
break;
case ctlSelectEvent:
switch (eventP->data.ctlSelect.controlID)
{
case MainLblOkButtonButton:
Err err;
FieldPtr fldNameP =
(FieldPtr)GetObjectPtr(MainFldNameField);
FieldPtr fldPhoneP =
(FieldPtr)GetObjectPtr(MainFldPhoneField);
err = AddToDatabase(fldNameP,
fldPhoneP);
if(err == errNone)
handled = true;
fldNameP = NULL;
fldPhoneP = NULL;
break;
}
break;
//Snipped for brevity.
default:
break;
}
return handled;
}
Robert C. Brinson
Programmer/Analyst
DaySpring Cards
[EMAIL PROTECTED]
--
For information on using the Palm Developer Forums, or to unsubscribe, please see
http://www.palmos.com/dev/support/forums/