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/

Reply via email to