- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
{{div_begin}}
[[← 3 章に戻る|C/C++ Sync Suite Companion601/3]] [[↑トップへ|C/C++ Sync Suite Companion601]] [[5 章に進む →|C/C++ Sync Suite Companion601/5]]
{{div_end}}
{{div_begin style="margin-bottom:-10px"}}
!!!4 クラシック同期マネージャ API の使用
{{div_end}}
{{div_begin "style='position:absolute;right:0px;font-size:70%;margin-right:15px;margin-top:15px;width:250px;'"}}
*{{goto Classic Sync Manager Overview,クラシック同期マネージャの概要}}
**{{goto Sync Manager Error Checking,同期マネージャ エラー チェック}}
**{{goto Classes and Structures in Sync Manager,同期マネージャの中のクラスと構造体}}
**{{goto Sync Manager and Performance,同期マネージャとパフォーマンス}}
**{{goto Typical Flow of Sync Manager Calls,一般的な同期マネージャ呼び出しのフロー}}
*{{goto Registering Your Conduit with Sync Manager,コンジットの同期マネージャへの登録}}
*{{goto Opening Your Database,データベースのオープン}}
*{{goto Working with Databases,データベースに対する動作}}
**{{goto Reading Handheld Database Records and Resources,ハンドヘルド データベースのレコードとリソースの読み込み}}
**{{goto Iterating Through a Database,データベースの初めから終わりまでの反復操作}}
**{{goto Iterating Through a Database,データベースの始めから終わりまでの反復操作}}
**{{goto Writing Handheld Database Records and Resources,ハンドヘルド データベースのレコードとリソースの書き込み}}
**{{goto Deleting Records in Handheld Databases,ハンドヘルド データベースの中のレコードの削除}}
**{{goto Cleaning Up Records,レコードのクリーン アップ}}
*{{goto Closing Your Database,データベースのクローズ}}
*{{goto Updating the HotSync Manager Progress Displya,HotSync マネージャ進捗表示の更新}}
{{div_end}}
{{div_begin "style='position:relative;padding:0px;padding-right:5px;padding-left:10px;margin-right:250px;margin-top:20px;width:auto;border-right-style:dotted;border-right-width:2px;border-right-color:silver;'"}}
クラシック同期マネージャ API は、{{goto classic database,クラシック データベース|Introduction to Conduit Development601/Glossary}} に対する HotSync 実施への low-level プログラミング インターフェイスです。この章は、同期マネージャとそれをどのように使用するのかについての概要を以下の節に分けて提供します。
*{{goto Classic Sync Manager Overview,クラシック同期マネージャの概要}}
*{{goto Registering Your Conduit with Sync Manager,コンジットの同期マネージャへの登録}}
*{{goto Opening Your Database,データベースのオープン}}
*{{goto Working with Databases,データベースに対する動作}}
*{{goto Closing Your Database,データベースのクローズ}}
*{{goto Updating the HotSync Manager Progress Displya,HotSync マネージャ進捗表示の更新}}
同期マネージャ API ライブラリは、C/C++ Sync Suite の {{span style='color:blue;font-family:monospace;',<CDK>\C++\Win\lib}} ディレクトリの中にあります。
!!{{anchor Classic Sync Manager Overview}}クラシック同期マネージャの概要 {{goto top,^TOP^}}
クラシック同期マネージャは、クラシック データベースに対する同期操作の間のハンドヘルドとデスクトップ コンピュータ間のすべての通信を管理します。これは、コンジットがハンドヘルドとデスクトップ間をデータがどのように移動しているのかを考慮すること無しにコンジットの操作を実行することを可能にします。
あなたのコンジットは、直接ケーブル接続、モデム接続、ネットワーク接続を見分ける必要はありません。実際、あなたのコードはデスクトップ コンピュータとハンドヘルド間のデータの交換メカニズムに対してまったく注意を払う必要がありません。
----
'''NOTE:'''同期マネージャはハンドヘルド上の Palm OS データベースにのみアクセスします。拡張スロットの中にあるカードにアクセスするには、[[第 6 章 「拡張テクノロジの使用」|C/C++ Sync Suite Companion601/6]] の中で説明されている拡張マネージャと仮想ファイル システム マネージャを呼び出します。
----
HotSync マネージャは、ユーザのデスクトップ コンピュータ上の HotSync マネージャに適切に登録された各コンジットを呼び出します。HotSync マネージャは、あなたのコンジットの中のエントリ ポイント {{goto OpenConduit,OpenConduit()|C/C++ Sync Suite Reference601/6}} 関数を呼び出します。これにより、あなたのコンジットは操作を開始します。それから、コンジットは同期マネージャ関数を呼び出してハンドヘルドとデータを交換します。
同期マネージャを使用するために、あなたのコンジットはまずコンジットをコンフィグレーションするために、同期マネージャの {{goto SyncRegisterConduit,SyncRegisterConduit()|C/C++ Sync Suite Reference601/5-2}} 関数を呼び出さなくてはなりません。それから、あなたは Syns マネージャ関数を呼び出してハンドヘルドとデータを交換することができます。同期プロセスが終了したときは、{{goto SyncUnRegisterConduit,SyncUnRegisterConduit()|C/C++ Sync Suite Reference601/5-2}} 関数を呼び出して同期マネージャを他のプロセスに解放します。
----
'''NOTE:'''同期マネージャはスレッド-セーフを保証しません。これは、あなたがあなたのコンジットを起動した同じスレッドからあなたのすべての同期マネージャ呼び出しを行わなくてはならないということを意味します。
----
!{{anchor Sync Manager Error Checking}}同期マネージャ エラー チェック {{goto top,^TOP^}}
ハンドヘルドへの接続はいつでも中断される可能性があるため、あなたは同期マネージャ関数呼び出しの後に必ずエラーをチェックしなければなりません。
::重要
:::あなたの同期マネージャ呼び出しがエラーを返す場合、その関数によって返される他の値は未定義であると見なされます。それらの値を使用することはデータの不具合を引き起こす可能性があります。
!{{anchor Classes and Structures in Sync Manager}}同期マネージャの中のクラスと構造体 {{goto top,^TOP^}}
同期マネージャ API はこの章で説明されるいくつかのクラスを含みます。これらのクラスはすべてデータ メンバのみから構成され、あなたが標準 C データ 構造体を使用するのと同じ要領で使用することができます。
!{{anchor Sync Manager and Performance}}同期マネージャとパフォーマンス {{goto top,^TOP^}}
あなたは、あなたの同期マネージャ関数呼び出しの多くがデスクトップ コンピュータとハンドヘルド間のデータの転送を要求するということを心に留めておく必要があります。これらの呼び出しは入出力用であり、完了するのにかなりの時間を要します。あなたのコンジットがベスト パフォーマンスを発揮させるためには、あなたはあなたのロジックを最小限の同期マネージャ関数呼び出しで構成する必要があります。
特に、あなたは以下のパフォーマンス強化 Tips を心に留めてあなたのコードを設計すべきです:
*ハンドヘルド データベースから複数回同じレコードまたは情報ブロックを読み込むことを避けます。あなたはデスクトップ コンピュータに情報をキャッシュすることで同じ情報に複数回アクセスする必要を無くすことができます。
*あなたがデータベースから情報を読み込んでいるとき、データベースの中にある可能性がある最大レコード サイズのレコードを保存するのに十分な大きさのバッファ(最大 64 KB)を割り当てます。これにより、データ サイズを決定するために呼び出しを行い、データを実際に読み込むためにもう 1 度呼び出しを行うよりもかなり早く実行されます。
以下の同期マネージャ関数は入出力用ではなく、それゆえあなたのコンジットのパフォーマンスに大きな影響を与えることなしに呼び出すことができます。:
*{{goto SyncGetAPIVersion,SyncGetAPIVersion()|C/C++ Sync Suite Reference/5-2}}
*{{goto SyncHHToHostDWord,SyncHHToHostDWord()|C/C++ Sync Suite Reference/5-2}}
*{{goto SyncHHToHostWord,SyncHHToHostWord()|C/C++ Sync Suite Reference/5-2}}
*{{goto SyncHostToHHDWord,SyncHostToHHDWord()|C/C++ Sync Suite Reference/5-2}}
*{{goto SyncHostToHHWord,SyncHostToHHWord()|C/C++ Sync Suite Reference/5-2}}
*{{goto SyncYieldCycles,SyncYieldCycles()|C/C++ Sync Suite Reference/5-2}}
!{{anchor Typical Flow of Sync Manager Calls}}一般的な同期マネージャ呼び出しのフロー {{goto top,^TOP^}}
以下の節では、一般的なコンジットからの同期マネージャ呼び出しのフローを説明します。これらの呼び出しは以下のカテゴリに分けられます:
*コンジットの同期マネージャへの登録
*データベースのオープン
*レコードと読み込みと書き込み
*レコード カテゴリに対する動作
*データベースのクローズ
*コンジットの同期マネージャへの登録の解除
!!{{anchor Registering Your Conduit with Sync Manager}}コンジットの同期マネージャへの登録 {{goto top,^TOP^}}
あなたは {{goto SyncRegisterConduit,SyncRegisterConduit()|C/C++ Sync Suite Reference601/5-2}} 関数を呼び出すことによって、あなたのコンジットを同期マネージャに登録しなければなりません。同期マネージャはあなたのコンジットのためのハンドルを返し、あなたはその後に続く呼び出しでそのハンドルを使用します。あなたのコンジットが実行されたとき、あなたは {{goto SyncUnRegisterConduit,SyncUnRegisterConduit()|C/C++ Sync Suite Reference601/5-2}} 関数を呼び出すことによって、そのコンジットの登録を解除します。たいていのコンジットはこれらの呼び出しをそれら自身の {{goto OpenConduit,OpenConduit()|C/C++ Sync Suite Reference601/6}} 関数の中で行います。
----
'''NOTE:'''同期マネージャへの登録と HotSync マネージャへの登録を混同しないように注意してください。あなたのコンジットは実行時に同期マネージャに登録されなければなりません。あなたはインストール時にあなたのコンジットを HotSync マネージャに登録しなければなりません。さもなければ、HotSync マネージャはあなたのコンジットを実行しません({{goto Registering C API-based Conduits with HotSync Manager,「C API-ベース コンジットの HotSync マネージャへの登録」|C/C++ Sync Suite Comapnion601/2}} を参照してください)。
----
!!{{anchor Opening Your Database}}データベースのオープン {{goto top,^TOP^}}
あなたは {{goto SyncCreateDB,SyncCreateDB()|C/C++ Sync Suite Reference601/4-1}} 関数を使用して新たにオープンされたデータベースをハンドヘルド上に作成することができ、{{goto SyncOpenDB,SyncOpenDB()|C/C++ Sync Suite Reference601/4-1}} 関数を使用して存在しているハンドヘルド データベースをオープンすることができます。{{goto Listing 4.1,コード 4.1}} は {{span style='color:blue;font-family:monospace;',OpenDataBase()}} 関数部分のコードです。この関数は {{span style='color:blue;font-family:monospace;',SyncCreateDB()}} 関数と {{span style='color:blue;font-family:monospace;',SyncOpenDB()}} 関数の両方を呼び出します。
{{anchor Listing 4.1}}
'''コード 4.1 ハンドヘルド データベースのオープン'''
BOOL OpenDataBase( CLogMgr& theLog, const char * pName, DWORD dbCreator,
DWORD dbType, BYTE& hDataBase, WORD& dbRecordCount,
BOOL clearDB )
{
long retVal;
// Open the remote database.
retVal = SyncOpenDB( pName, 0, hDataBase );
if ( retVal )
{
if ( retVal == SYNCERR_FILE_NOT_FOUND )
{
TRACE( "SyncOpenDB( %s ) failed [ %lX ], attempting to create DB.\n",
pName, retVal );
// The database does not exist, so create it.
CDbCreateDB createInfo;
memset( &createInfo, 0, sizeof( CDbCreateDB ) ) ;
createInfo.m_Creator = dbCreator;
createInfo.m_Type = dbType;
createInfo.m_Flags = eRecord; // eRecord;
createInfo.m_CardNo = 0; // Target card number
createInfo.m_Version = 0;
ASSERT( strlen( pName ) <= DB_NAMELEN );
strcpy( createInfo.m_Name, pName );
retVal = SyncCreateDB( createInfo );
if ( retVal )
{
CString theDBName( pName );
// fatal error
theLog.Message( IDS_CANT_CREATE_DB, theDBName, TRUE );
TRACE( "SyncCreateDB( %s ) failed [ %lX ].\n", pName, retVal );
return FALSE;
}
else
{
// Database is open with handle createInfo.m_FileHandle.
hDataBase = createInfo.m_FileHandle;
TRACE( "SyncCreateDB( %s ) succeeded.\n", pName );
}
}
else
{
CString theDBName( pName );
// fatal error
theLog.Message( IDS_CANT_OPEN_DB, theDBName, TRUE );
TRACE( "SyncOpenDB( %s ) failed [ %lX ].\n", pName, retVal );
return FALSE;
}
}
// If clearDB, then clear all the existing records in the database.
if ( clearDB )
{
retVal = SyncPurgeAllRecs( hDataBase );
if ( retVal )
{
CString theDBName( pName );
// fatal error
theLog.Message( IDS_CANT_PURGE_DB, theDBName, TRUE );
TRACE( "SyncPurgeAllRecs( %s ) failed [ %lX ].\n", pName, retVal );
return FALSE;
}
else
{
TRACE( "SyncPurgeAllRecs( %s ) succeeded.\n", pName );
}
}
// Determine how many records are in the remote database.
retVal = SyncGetDBRecordCount( hDataBase, dbRecordCount );
if ( retVal )
{
if ( hDataBase ) SyncCloseDB( hDataBase );
CString theDBName( pName );
// fatal error
theLog.Message( IDS_CANT_GET_DBRECCOUNT, theDBName, TRUE );
TRACE( "SyncGetDBRecordCount( %s ) failed [ %lX ].\n", pName, retVal );
return FALSE;
}
return TRUE;
} // OpenDataBase
!!{{anchor Working with Databases}}データベースに対する動作 {{goto top,^TOP^}}
各データベースは以下の特性を持つレコードの集まりです:
*データベースの中の各レコードはデータベース内で固有の ID を持ちます。
*データベースの中の各レコードは、そのレコードがプライベートである、削除された、変更された、アーカイブされた、Busy 状態であるとマークを付けられたかどうかを指定するフラグを持ちます。
*データベースの中の各レコードはカテゴリに属します。
*データベースは、データベースについてのグローバルな情報を保存するアプリケーション情報ブロックを保持します。このブロックは通常データベースの中にあるレコードのためのカテゴリ名を保存するために使用されます。
*データベースは、データベースの中のレコードのための順序情報を保存するソート情報ブロックを持ちます。このブロックはアプリケーションが使用するためのものです; Palm OS はそれを使用しません。
!{{anchor Reading Handheld Database Records and Resources}}ハンドヘルド データベースのレコードとリソースの読み込み {{goto top,^TOP^}}
{{goto Table 4.1,表 4.1}} が示すように、同期マネージャはハンドヘルド上のデータベースからレコードとリソースを取得するための関数をいくつか提供します。これらの関数はそれぞれレコードまたはリソースを {{goto CRawRecordInfo,CRawRecordInfo|C/C++ Sync Suite Reference601/4-1}} クラスのオブジェクトの中に読み込みます。
各関数を呼び出す前に、あなたは {{span style='color:blue;font-family:monospace;',CRawRecordInfo}} オブジェクトのフィールドのいくつかに値を埋め込む必要があります。関数は辺土へルドからレコードを読み込み、他のフィールドにレコード情報を埋め込みます。各関数で要求されるフィールドは、各関数のためのドキュメントの中で説明されます。
{{anchor Table 4.1}}
'''表 4.1 ハンドヘルド データベースからレコードを読み込むための関数'''
,関数,説明
,"{{goto SyncReadNextModifiedRec,SyncReadNextModifiedRec()|C/C++ Sync Suite Reference601/4-2}}",ハンドヘルド上のオープンされたレコード データベースから次の変更、アーカイブ、削除されたレコードを取得する反復関数です。各呼び出しは、すべての変更されたレコードが返されるまで、次の変更されたレコードを取得します。
,"{{goto SyncReadNextModifiedRecInCategory,SyncReadNextModifiedRecInCategory()|C/C++ Sync Suite Reference601/4-2}}",ハンドヘルド上のオープンされたデータベースからあるカテゴリに属する次の変更、アーカイブ、削除されたレコードを取得する反復関数です。各呼び出しは、すべての変更されたレコードが返されるまで、カテゴリから次の変更されたレコードを取得します。
,"{{goto SyncReadNextRecInCategory,SyncReadNextRecInCategory()|C/C++ Sync Suite Reference601/4-2}}",ハンドヘルド上のオープンされたデータベースからあるカテゴリに属するすべてのレコード - 削除、アーカイブ、変更されたレコードを含む - を取得する反復関数です。各呼び出しは、すべてのレコードが返されるまで、カテゴリから次のレコードを取得します。
,"{{goto SyncReadRecordById,SyncReadRecordById()|C/C++ Sync Suite Reference601/4-2}}",ハンドヘルド上のオープンされたデータベースから ID でレコードを取得します。
,"{{goto SyncReadRecordByIndex,SyncReadRecordByIndex()|C/C++ Sync Suite Reference601/4-2}}",ハンドヘルド上のオープンされたデータベースからインデックスでレコードを取得します。
,"{{goto SyncReadResRecordByIndex,SyncReadResRecordByIndex()|C/C++ Sync Suite Reference601/4-2}}",ハンドヘルド上のオープンされたリソース データベースからインデックスによってリソース レコードを取得します。
{{goto Listing 4.2,コード 4.2}} は、インデックスでレコードを読み込む {{span style='color:blue;font-family:monospace;',SyncReadRecordByIndex()}} を呼び出す {{span style='color:blue;font-family:monospace;',ImportPrefs()}} という名前を付けられたメソッドです。
{{anchor Listing 4.2}}
'''コード 4.2 ハンドヘルド データベースからのレコードの読み込み'''
BOOL CNetPrefs::ImportPrefs( BYTE hHHDataBase, WORD recIndex )
{
BYTE readBuf[ READ_BUF_SIZE ];
BOOL importSuccess = TRUE;
fHDataBase = hHHDataBase;
// Read from the HH database at index recIndex.
CRawRecordInfo rrInfo;
::memset( &rrInfo, 0, sizeof( rrInfo ) );
rrInfo.m_FileHandle = hHHDataBase;
rrInfo.m_RecIndex = recIndex;
rrInfo.m_pBytes = (BYTE *) &readBuf[ 0 ];
rrInfo.m_RecSize = READ_BUF_SIZE;
rrInfo.m_TotalBytes = READ_BUF_SIZE;
long retVal = ::SyncReadRecordByIndex( rrInfo );
if ( retVal )
{
importSuccess = FALSE;
fPLogMgr->Message( IDS_CANT_READ_DB );
}
else
{
// The read succeeded, so copy the data onto fCompressedBuffer.
fHHDBRecID = rrInfo.m_RecId;
ASSERT( rrInfo.m_RecSize != 0 );
if ( fCompressedBuffer != NULL ) delete fCompressedBuffer;
fCompressedBuffer = new BYTE[ rrInfo.m_RecSize ];
fCompressedLength = rrInfo.m_RecSize;
::memcpy( (void *) fCompressedBuffer, (void *) rrInfo.m_pBytes,
fCompressedLength );
}
return importSuccess;
} // CNetPrefs::ImportPrefs
!{{anchor Iterating Through a Database}}データベースの初めから終わりまでの反復操作 {{goto top,^TOP^}}
!{{anchor Iterating Through a Database}}データベースの始めから終わりまでの反復操作 {{goto top,^TOP^}}
同期マネージャはまた、ハンドヘルド上のデータベースの初めから終わりまでを反復操作させるのに使用することができる関数も提供します。データベースの初めから終わりまでを反復してレコードを操作するために、あなたはまず {{goto SyncResetRecordIndex,SyncResetRecordIndex()|C/C++ Sync Suite Reference601/4-2}} 関数を呼び出すことによってデータベースの中を指す現在のインデックをリセットし、それから以下の取得関数の 1 つを繰り返し呼び出します。
同期マネージャはまた、ハンドヘルド上のデータベースの始めから終わりまでを反復操作させるのに使用することができる関数も提供します。データベースの始めから終わりまでを反復してレコードを操作するために、あなたはまず {{goto SyncResetRecordIndex,SyncResetRecordIndex()|C/C++ Sync Suite Reference601/4-2}} 関数を呼び出すことによってデータベースの中を指す現在のインデックをリセットし、それから以下の取得関数の 1 つを繰り返し呼び出します。
*{{goto SyncReadNextRecInCategory,SyncReadNextRecInCategory()|C/C++ Sync Suite Reference601/4-2}} はある特定のレコード カテゴリに属する次のレコードを取得します。
*{{goto SyncReadNextModifiedRec,SyncReadNextModifiedRec()|C/C++ Sync Suite Reference601/4-2}} は変更された(最後の同期の後に)次のレコードを取得します。
*{{goto SyncReadNextModifiedRecInCategory,SyncReadNextModifiedRecInCategory()|C/C++ Sync Suite Reference601/4-2}} はある特定のレコード カテゴリに属する変更された次のレコードを取得します。
同期マネージャはデータベースのオープン時に自動的にデータベースのために現在のデータベース反復インデックスをリセットします。その後の反復操作のためにインデックスをリセットするためには、あなたは {{goto SyncResetRecordIndex,SyncResetRecordIndex()|C/C++ Sync Suite Reference601/4-2}} 関数を呼び出さなくてはなりません。
{{goto Listing 4.3,コード 4.3}} はハンドヘルド データベースの中にある変更された各レコードを取得する {{goto SyncReadNextModifiedRec,SyncReadNextModifiedRec()|C/C++ Sync Suite Reference601/4-2}} を使用するコードです。
{{anchor Listing 4.3}}
'''コード 4.3 ハンドヘルド レコードを読み込むための反復関数の使用'''
CRawRecordInfo rawRecord;
retval = AllocateRawRecordMemory(rawRecord, EXPENSE_RAW_REC_MEM);
// Read in each modified remote record one at a time.
while (!err && !retval)
{
if (!(err = SyncReadNextModifiedRec(rawRecord)))
{
// Convert from raw record format to CExpenseRecord.
if (!m_pDTConvert->ConvertFromRemote(remRecord, rawRecord))
{
// Synchronize the record obtained from the handheld.
retval = SynchronizeRecord(remRecord, locRecord,
backRecord);
}
else
retval = CONDERR_CONVERT_FROM_REMOTE_REC;
}
memset(rawRecord.m_pBytes, 0, rawRecord.m_TotalBytes);
}
if (err && err != SYNCERR_FILE_NOT_FOUND)
LogBadReadRecord(err);
{{anchor Modifying a Database While Iterating}}
'''反復操作中のデータベースの変更'''
同期マネージャは、同時にデータベースの反復操作と変更を行うインタリーブ(多重プログラミング技法)をサポートしません。これは、あなたはあなたのロジックをデータベースの反復操作中にデータベースを変更しないように構成する必要があるということを意味します。Palm OS ソフトウェアのバージョン 2.0 から、あなたはデータベースの反復操作中にデータベースから安全にレコードを削除できるようになりました({{goto SyncPurgeAllRecsInCategory,SyncPurgeAllRecsInCategory()|C/C++ Sync Suite Reference601/4-1}} 関数は除きます)。
!{{anchor Writing Handheld Database Records and Resources}}ハンドヘルド データベースのレコードとリソースの書き込み {{goto top,^TOP^}}
同期マネージャは、ハンドヘルド上のデータベースにレコードとリソースを書き込むための関数をいくつか提供します。これらの関数はそれぞれあなたが {{goto CRawRecordInfo,CRawRecordInfo|C/C++ Sync Suite Reference601/4-1}} クラスのオブジェクトの中に保存したレコード情報を送信します。あなたはこれらの関数を使って存在しているレコードを変更したり、新しいレコードをデータベースに追加することができます。
ハンドヘルド データベースにレコードを書き込むためには、{{span style='color:blue;font-family:monospace;',CRawRecordInfo}} オブジェクトのある特定のフィールドを満たし、それから同期マネージャのレコード書き込み関数の 1 つを呼び出します。関数はレコードをハンドヘルド上のデータベースに送ります。
あなたは {{goto SyncWriteRec,SyncWriteRec()|C/C++ Sync Suite Reference601/4-2}} 関数を使ってレコードをハンドヘルド レコード データベースに書き込むことができ、{{goto SyncWriteResourceRec,SyncWriteResourceRec()|C/C++ Sync Suite Reference601/4-2}} 関数を使ってリソースをハンドヘルド上のリソース データベースに書き込むことができます。
{{goto Listing 4.4,コード 4.4}} は {{span style='color:blue;font-family:monospace;',SyncWriteRec()}} 関数を呼び出す {{span style='color:blue;font-family:monospace;',ExportPrefs()}} という名前を付けられたメソッドです。
{{anchor Listing 4.4}}
'''コード 4.4 ハンドヘルドへのレコードの書き込み'''
BOOL CNetPrefs::ExportPrefs( BYTE hHHDataBase )
{
BOOL exportSuccess = TRUE;
fHDataBase = hHHDataBase;
if ( fCompressedLength != 0 )
{
ASSERT( fCompressedBuffer != NULL );
// write to the HH database.
CRawRecordInfo rrInfo;
::memset( &rrInfo, 0, sizeof( rrInfo ) );
rrInfo.m_FileHandle = hHHDataBase;
rrInfo.m_RecId = fHHDBRecID;
rrInfo.m_pBytes = fCompressedBuffer;
rrInfo.m_RecSize = fCompressedLength;
long retVal = ::SyncWriteRec( rrInfo );
if ( retVal )
{
exportSuccess = FALSE;
fPLogMgr->Message( IDS_CANT_WRITE_DB );
}
}
return exportSuccess;
} // CNetPrefs::ExportPrefs
!{{anchor Deleting Records in Handheld Databases}}ハンドヘルド データベースの中のレコードの削除 {{goto top,^TOP^}}
あなたが同期マネージャ関数を使ってデータベースからレコードまたはリソースを削除するとき、レコードまたはリソースはただちにデータベースから削除されます。これは、ハンドヘルド上のアプリケーションがレコードを削除するために使用するいくつかの関数 - それらはレコードに削除されたというマークを付けるだけで、それらをただちに削除することはしません - とは対照的です。
::NOTE
:::{{span style='color:blue;font-family:monospace;',Delete}} または {{span style='color:blue;font-family:monospace;',Purge}} で始まる同期マネージャ関数はどちらもオブジェクトをただちに削除します。
同期マネージャは、データベースからレコードまたはリソースを削除するための関数をいくつか提供します。これらの関数を使うために、あなたは {{goto CRawRecordInfo,CRawRecordInfo|C/C++ Sync Suite Reference601/4-1}} クラスのオブジェクトの中の特定のフィールドにデータを代入します。それから、あなたは {{goto Table 4.2,表 4.2}} の中で説明される関数の 1 つを呼び出します。
{{anchor Table 4.2}}
'''表 4.2 単一のレコードを削除するための関数'''
,関数,説明
,"{{goto SyncDeleteRec,SyncDeleteRec()|C/C++ Sync Suite Reference601/4-1}}",レコード データベースからレコードを削除します。
,"{{goto SyncDeleteResourceRec,SyncDeleteResourceRec()|C/C++ Sync Suite Reference601/4-1}}",リソース データベースから特定のリソースを削除します。
あなたは {{goto Table 4.3,表 4.3}} の中で説明される関数の 1 つを呼び出すことによって複数のレコードを削除することができます。
{{anchor Table 4.3}}
'''表 4.3 複数のレコードを削除するための関数'''
,関数,説明
,"{{goto SyncPurgeAllRecs,SyncPurgeAllRecs()|C/C++ Sync Suite Reference601/4-1}}",ハンドヘルド上のレコード データベースの中のすべてのレコードを削除します。
,"{{goto SyncPurgeAllRecsInCategory,SyncPurgeAllRecsInCategory()|C/C++ Sync Suite Reference601/4-1}}",ハンドヘルド上のレコード データベースからある特定のカテゴリに属するすべてのレコードを削除します。
,"{{goto SyncDeleteAllResourceRec,SyncDeleteAllResourceRec()|C/C++ Sync Suite Reference601/4-1}}",リソース データベースからすべてのリソースを削除します。
!{{anchor Cleaning Up Records}}レコードのクリーン アップ {{goto top,^TOP^}}
あなたは、あなたの同期操作の最後に、{{goto Table 4.4,表 4.4}} の中で示される関数を使ってレコードの状態フラグをクリアすることができます。
{{anchor Table 4.4}}
'''表 4.4 レコードをクリーン アップするための関数'''
,関数,説明
,"{{goto SyncResetSyncFlags,SyncResetSyncFlags()|C/C++ Sync Suite Reference601/4-2}}",ハンドヘルド上のオープンされたレコード データベースの中のすべてのレコードの変更されたフラグをリセットします。オープンされたレコード データベースまたはリソース データベースのためのバックアップ日付をリセットします。
!!{{anchor Closing Your Database}}データベースのクローズ {{goto top,^TOP^}}
あなたがハンドヘルド データベースとの同期を終了した後、あなたは {{goto Listing 4.1,コード 4.1}} のように {{goto SyncCloseDB,SyncCloseDB()|C/C++ Sync Suite Reference601/4-1}} または {{goto SyncCloseDBEx,SyncCloseDBEx()|C/C++ Sync Suite Reference601/4-1}} 関数を呼び出してデータベースをクローズしなければなりません。同期マネージャはいつでもただ 1 つだけデータベースをオープンさせることを許可します。
::重要
:::あなたがデータベースをオープンしている場合、あなたはあなたのコンジットを終了する前にそれをクローズしなければなりません; さもないと、他のコンジットはそれらのデータベースをオープンさせることができなくなります。
!!{{anchor Updating the HotSync Manager Progress Displya}}HotSync マネージャ進捗表示の更新 {{goto top,^TOP^}}
あなたのコンジットが同期マネージャ呼び出しの間に時間のかかる操作を実行している場合、あなたは定期的に {{goto SyncYieldCycles,SyncYieldCycles|C/C++ Sync Suite Reference601/5-2}} 関数を呼び出して、HotSync マネージャの進捗表示が現在の進捗状況を示し続けるようにする必要があります({{goto Figure 4.1,図 4.1}})。あなたがこの関数を十分に定期的に呼び出すことを怠った場合、ユーザ インターフェイスは固まった状態になります。
あなたは {{goto SyncYieldCycles,SyncYieldCycles|C/C++ Sync Suite Reference601/5-2}} 関数と他のすべての同期マネージャ関数を、あなたのコンジットを起動したのと同じスレッドから呼び出さなくてはなりません。
{{anchor Figure 4.1}}
'''図 4.1 HotSync マネージャ進捗表示インジケータ'''
{{img hotsyncprogress.jpg,style='width:302px;height:204px;'}}
{{div_end}}
{{div_begin "style='border-top-style:solid;border-top-width:1px;border-top-color:silver;'"}}
[[← 3 章に戻る|C/C++ Sync Suite Companion601/3]] [[↑トップへ|C/C++ Sync Suite Companion601]] [[5 章に進む →|C/C++ Sync Suite Companion601/5]]
{{div_end}}