Tech Note 25: Accessing Palm OS DatabasesJanuary 9, 2008© NS BASIC Corporation. All rights reserved. |
Introduction Objects Index and Quick Reference Objects and Collections Functions Methods Properties
The PalmDB Automation Control (PalmDB.dll) is a COM component that allows full access to Palm OS Database files as created by Palm organizers, Treo phones, or similar handeld devices. These are .pdb files containing a binary representation of a database as stored on a desktop PC after a backup HotSync.
PalmDB was created by Maxime Labelle several years ago. While it is no longer be actively maintained by the author, it works reasonably well and the source code is freely available. We've made some enhancements to it. If you have made improvements to the control itself, please let us know.
You can download the original binaries, source and documentation here:
http://www.palmgear.com/index.cfm?fuseaction=software.showsoftware&PartnerREF=&siteid=1&prodID=7371
In order to use the PalmDB Automation Control, PalmDB.dll
must be copied to the computer running an NSBasic program that uses it. As it is an ActiveX control, it is not contained within an NS Basic/Desktop program and must be installed and registered separately. It is, however, included in the NS Basic/Desktop installer so if you are developing using NS Basic/Desktop, there is nothing you need to do to install on your own machine.
To use the control in an NSBasic program, include the statement
AddObject "PalmDB.Database", "PalmDB"
This must be executed before the control can be used.
"PalmDB"
is the name that you will use to refer to the control. Any name can
be used, but this document assumed "PalmDB"
. Each instance of the control can only open a single database, so if you need
multiple databases opened, such as for copying, you will need additional AddObject
statements.
There is a sample called PalmDatabase included with the standard set of samples that come with NS Basic/Desktop. It shares a data file called keydbtest.pdb with the sample called KeyedDBDemo, included with NS Basic/Palm.
To use this control, you need to use NS Basic/Desktop 1.2 or later.
The PalmDB Automation Control exposes the following objects and collection:
Object | Description |
---|---|
Database | The Database object is the
top-level object and can be directly created by a client application. It
represents a .pdb file on the desktop. Use PalmDB to refer to this object. |
ApplicationInfo | Each PalmOSc database can contain user-defined application-specific
data. This usually contains the database categories. Use PalmDB.ApplicationInfo to refer
to this object. |
Records | The Records collection allows both
random and sequential access to the list of records in the database. Adding
and removing records is also supported. Use PalmDB.Record to refer to this collection. |
Record | This object represents an actual record in the database. It
exposes methods and functions to manage the individual fields. Use PalmDB.Records(whichRecord)
refer to an individual record. Records are numbered starting at 0 and running through PalmDB.Records.Count
- 1 . |
Objects and Collections | |
ApplicationInfo (object) | ApplicationInfo |
Database (object) | Database |
Record (object) | Record |
Records (collection) | Records |
Functions | |
Count (function) | object.Count |
GetDateField (function) | object.GetDateField(Offset) |
GetDoubleField (function) | object.GetDoubleField(Offset) |
GetNSBDateField (function) | object.GetNSBDateField(Offset) |
GetNSBTimeField (function) | object.GetNSBTimeField(Offset) |
GetSingleField (function) | object.GetSingleField(Offset) |
GetStringField (funtion) | object.GetStringField(Offset, length) |
GetValueField (function) | object.GetValueField(Offset, Length) |
Item (function) | object[.Item](Index) |
Methods | |
Add (method) | object.Add(Index) |
CategoryInitialize (method) | object.CategoryInitialize |
Load (method) | object.Load(Filename) |
PutDateField (method) | object.PutDateField(Value, Offset) |
PutDoubleField (method) | object.PutDoubleField(Value, Offset) |
PutNSBDateField (method) | object.PutNSBDateField(Value, Offset) |
PutNSBTimeField (method) | object.PutNSBTimeField(Value, Offset) |
PutSingleField (method) | object.PutSingleField(Value, Offset) |
PutStringField (method) | object.PutStringField(Value, [Offset]) |
PutValueField (method) | object.PutValueField(Value, Offset, Length)
|
Remove (method) | object.Remove(Index) |
Save (method) | object.Save(Filename) |
Properties | |
ApplicationInfo (property) | object.ApplicationInfo |
Attributes (property) | object.Attributes [= Value] |
Category (property - Record object) | object.Category [= Value] |
Category (property - ApplicationInfo object) | object.Category(Index) [= Value] |
CreationDate (property) | object.CreationDate |
Creator (property) | object.Creator [= Value] |
ModificationDate | object.ModificationDate |
Name (property) | object.Name [= Value] |
Records (property) | object.Records |
Size (property) | object.Size [= Value] |
Type (property) | object.Type [= Value] |
The ApplicationInfo object can contain user-defined application-specific
data.
This usually contains the database categories.
ApplicationInfo
This implementation doesn't support putting arbitrary data in the application-info
area. To this end, methods and functions will be added, much like the implementation
of the Record object.
This object can not be created directly. Instead, use the ApplicationInfo property
of the Database object.
The Database object is the top-level object and can be directly created
by a client application. It represent a .pdb file on the desktop.
Database
Use the AddObject
statement to create a database object as described in
Installation and Use
The Record object represents an actual record in the database. It exposes
methods and functions to manage the individual fields.
Record
This object can not be created directly. Instead, use the methods and functions of the Records collection.
The Records collection allows for both random and sequential access to
the list of records in the database. Adding and removing records is also supported.
Records
The Records object support Visual Basic's For Each construct to allow for enumerating the records in the Database.
This object can not be created directly. Instead, use the Records property of the Database object.
object.Count
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
object.GetDateField(Offset)The GetDateField function syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Offset | Offset in bytes from the beginning of the record data where the date starts, starting from 0. |
A Date value stored in a field is a 4-byte long value.
object.GetDoubleField(Offset)The GetDoubleField function syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Offset | Offset in bytes from the beginning of the record data where the double-precision floating point number starts, starting from 0. |
GetDoubleField can be used to retrieve NSBasic Palm dates and times. See the NSBasic Palm documentation for more information.
object.GetNSBDateField(Offset)The GetNSBDateField function syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Offset | Offset in bytes from the beginning of the record data where the date starts, starting from 0. |
The NSBasic Desktop Date
type includes both the date and time,
while the NSBasic Palm Date
type only includes the date. This method
will return a value that represents midnight on the given date. It can be combined
with the GetNSBTimeField method to combine an NSBasic Palm
date and time into a single value.
object.GetNSBTimeField(Offset, BaseDate)The GetNSBTimeField function syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Offset | Offset in bytes from the beginning of the record data where the time starts, starting from 0. |
BaseDate | The date which is combined with the time to form an NSBasic Desktop date. |
The NSBasic Desktop Date
type includes both the date and time,
while the NSBasic Palm Time
type only includes the time. You must
include a date in which the time is given.
The following code fragment shows how to reas an NSBasic Desktop date from a database containing a date and a time:
With PalmDB.Records(0) Dim dt Dim d d = .GetNSBDateField(0) dt = .GetNSBTimeField(8, d) MsgBox t End With
If you are only interested in comparing times within a single arbitrary day, you can
use the Now
function to get today's date and use that as the base date.
object.GetSingleField(Offset)The GetSingleField function syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Offset | Offset in bytes from the beginning of the record data where the single-precision floating point number starts, starting from 0. |
object.GetStringField(offset[, length])The GetStringField function syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Offset | Offset in bytes from the beginning of the record data where the string starts, starting from 0. |
Length | Number of bytes to read |
This function will retrieve all of the characters from the offset to the end of the record. This is useful for storing binary data in a database. When the string contains text, use code similar to the following to trim the string:
s = PalmDB.Record(0).GetStringField(37)
s = Left(s, Instr(s, chr(0)) - 1)
object.GetValueField(Offset, Length)The GetValueField function syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Offset | Offset in bytes from the beginning of the record data where the value starts, starting from 0. |
Length | Length in bytes of the value to retrieve. Can either be 1 (Byte), 2 (Integer) or 4 (Long). |
object[.Item](Index)The Item function syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Index | A valid index of the record to be retrieved, in the range [0 - Count]. |
object.Add(Index)The Add method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Index | A numeric value specifying the index of the new record in the database, starting from 0. The record will be inserted at position Index or appended to the list of records if Index is equal the records Count. |
object.CategoryInitializeThe CategoryInitialize method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
The CategoryInitialize method creates initial categories of Unfiled
,
Business
and Personal
.
object.Load(Filename)The Load method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Filename | The full path name of the .pdb file in which the Database is stored. If FileName does not exist, an error will be raised. Use On Error Resume Next to trap this. If you want to create a new database, do not do a Load. |
object.PutDateField(Value, Offset)The PutDateField method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A Date value to be stored in the field. |
Offset | Offset in bytes from the beginning of the record data where the value starts, starting from 0. |
This method works on Palm dates, which are 4-byte integers representing a total number of seconds since a specified date. These are different from from NSBasic dates.
object.PutDoubleField(Value, Offset)The PutDoubleField method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A double-precision floating point value to be stored in the field. |
Offset | Offset in bytes from the beginning of the record data where the value starts, starting from 0. |
This method can be used to store NSBasic Palm dates and times. See the NSBasic Palm documentation for more information.
object.PutNSBDateField(Value, Offset)The PutNSBDateField method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A date value to be stored in the field. |
Offset | Offset in bytes from the beginning of the record data where the value starts, starting from 0. |
The Date
data type in NSBasic Desktop stores both the date and time of
day, while the Date
data type in NSBasic Palm only stores the date. This
method extracts the date portion of its argument and stores it as an NSBasic Palm date.
object.PutNSBDateField(Value, Offset)The PutNSBDateField method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A time value to be stored in the field. |
Offset | Offset in bytes from the beginning of the record data where the value starts, starting from 0. |
The Date
data type in NSBasic Desktop stores both the date and time of
day, while the Time
data type in NSBasic Palm only stores the time. This
method extracts the time portion of its argument and stores it as an NSBasic Palm time.
This time is truncated to the second.
object.PutSingleField(Value, Offset)The PutSingleField method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A single-precision floating point value to be stored in the field. |
Offset | Offset in bytes from the beginning of the record data where the value starts, starting from 0. |
object.PutStringField(Value, [Offset])The PutStringField method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A valid String to be stored in the field. |
Offset | Offset in bytes from the beginning of the record data where the value starts, starting from 0. |
object.PutValueField(Value, Offset, Length)The PutValueField method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A numeric value to be stored in the field. Make sure to use an appropriate datatype to hold the value, depending upon the Length. |
Offset | Offset in bytes from the beginning of the record data where the value starts, starting from 0. |
Length | Length in bytes of the value to retrieve. Can either be 1 (Byte), 2 (Integer) or 4 (Long). |
object.Remove(Index)The Remove method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Index | A valid index of the record to remove from the database, in the range 0 to Count - 1. |
object.Save(Filename)The Save method syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Filename | The full path name of the .pdb file in which to store the Database. If the file does not exist, it will be created. |
object.ApplicationInfoThe ApplicationInfo property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
object.Attributes [= Value]The Attributes property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A combination of one or more numeric values that represents the attributes to set. It is recommended to use the symbolic Database Attributes constants or Record Attributes constants to specify the mask. |
Name | Meaning |
---|---|
dmHdrAttrResDB | |
dmHdrAttrReadOnly | |
dmHdrAttrAppInfoDirty | |
dmHdrAttrBackup | |
dmHdrAttrOKToInstallNewer | |
dmHdrAttrResetAfterInstall | |
dmHdrAttrCopyPrevention | |
dmHdrAttrStream | |
dmHdrAttrHidden | |
dmHdrAttrLaunchableData | |
dmHdrAttrOpen | |
dmAllHdrAttrs |
Name | Meaning |
---|---|
dmRecAttrSecret | |
dmRecAttrBusy | |
dmRecAttrDirty | |
dmRecAttrDelete | |
dmAllRecAttrs |
Name | Meaning |
---|---|
dmRecAttrCategoryMask |
object.Category [= Value]The Category property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A numeric value in the range [0 - 15]. |
object.Category(Index) [= Value]The Category property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Index | A numeric value in the range [0 - 15]. |
Value | A valid String to be stored in the specified category slot. |
object.CreationDateThe CreationDate property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
object.Creator [= Value]The Creator property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A valid 4-letter String to hold the Database creator. A valid creator consist of a String containing upper-case only or mixed upper and lower case letters. Lower-case only creators are reserved for use by Palm. |
object.ModificationDateThe ModificationDate property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
object.Name [= Value]The Name property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A valid String to hold the name of the database. |
object.RecordsThe Records property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Applies To: ApplicationInfo, Record
object.Size [= Value]The Size property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | The new size of the object. The original contents of the object will be kept if at all possible. If the new size if greater than the current size, the object will be truncated. |
object.Type [= Value]The Type property syntax contains the following items:
Item | Meaning |
---|---|
object | An expression that evaluates to an object in the Applies To list. |
Value | A valid 4-letter String to hold the Database type. A valid type consist of a String containing lower-case only or mixed upper and lower case letters. Upper-case only types are reserved for use by Palm. |
This implementation assumes Data databases. Therefore, it is recommended to
always create new databases using a Type of "data
".