クエリからの結果値

2011. 02. 20
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
int sqlite3_column_type(sqlite3_stmt*, int iCol);
sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

これらのルーチンは『結果セット』インターフェイスから成ります。

これらのルーチンは、クエリの現在の結果行の単一列に関する情報を返します。

全ての場合において第1引数は評価されるprepared statementのポインタ(sqlite3_prepare_v2()またはその変種の一つから返されるsqlite3_stmt*)で、第2引数は情報を返す必要がある列のインデックスです。

結果セットの左端の列のインデックスは0です。

結果内の列数は、sqlite3_column_count()を使用して決定することができます。

SQLステートメントが現在有効な行を指していない、または列のインデックスが範囲外の場合、結果は未定義になります。

これらのルーチンは、最新のsqlite3_step()の呼び出しでSQLITE_ROWが返された時のみ呼び出される可能性があり、その後に呼び出されるsqlite3_reset()でもsqlite3_finalize()でもありません。

これらのルーチンのいずれかがsqlite3_reset()sqlite3_finalize()を呼び出した後、またはsqlite3_step()SQLITE_ROW以外の何かを返された後の場合、結果は未定義です。

sqlite3_step()sqlite3_reset()またはsqlite3_finalize()を異なるスレッドから呼び出した場合、これらのルーチンは保留されますが、結果は未定義です。

sqlite3_column_type()ルーチンは、結果列の初期データ型のためのdatatype codeを返します。

戻り値は、SQLITE_INTEGERSQLITE_FLOATSQLITE_TEXTSQLITE_BLOB、またはSQLITE_NULLのいずれかになります。

sqlite3_column_type()による戻り値は、後述するような型変換が生じない場合のみ意味を持ちます。

型変換後、sqlite3_column_type()による戻り値は未定義になります。

SQLiteの将来のバージョンでは型変換後のsqlite3_column_type()の動作が変更される場合があります。

結果がBLOBまたはUTF-8文字列の場合、sqlite3_column_bytes()ルーチンはBLOBまたは文字列内のバイト数を返します。

結果がUTF-16文字列の場合、sqlite3_column_bytes()は文字列をUTF-8に変換し、バイト数を返します。

結果が数値の場合、sqlite3_column_bytes()はsqlite3_snprintf()を使用して値をUTF-8文字列に変換し、文字列のバイト数を返します。

結果がNULLの場合、sqlite3_column_bytes()はゼロを返します。

結果がBLOBまたはUTF-16文字列の場合、sqlite3_column_bytes16()ルーチンはBLOBまたは文字列のバイト数を返します。

結果がUTF-8文字列の場合、sqlite3_column_bytes16()は文字列をUTF-16文字列に変換し、バイト数を返します。

結果が数値の場合、sqlite3_column_bytes16()はsqlite3_snprintf()を使用して値をUTF-16文字列に変換し、文字列のバイト数を返します。

結果がNULLの場合、sqlite3_column_bytes16()はゼロを返します。

sqlite3_column_bytes()sqlite3_column_bytes16()によって返される値は、文字列の末端にあるゼロ終端を含みません。

分かり易く言うとsqlite3_column_bytes()sqlite3_column_bytes16()は文字列内のバイト数を返すもので、文字数を返すものではありません。

sqlite3_column_text()とsqlite3_column_text16()によって返される文字列は空の文字列と同様に常にゼロ終端です。

長さがゼロのBLOBのsqlite3_column_blob()から返される値は、NULLポインタです。

sqlite3_column_value()によって返されるオブジェクトはunprotected sqlite3_valueオブジェクトです。

unprotected sqlite3_valueオブジェクトは、sqlite3_bind_value()sqlite3_result_value()でのみ使用することができます。

sqlite3_column_value()で返されたunprotected sqlite3_valueオブジェクトを他の方法で使用した場合、sqlite3_value_int()sqlite3_value_text()、またはsqlite3_value_bytes()のようなルーチンへの呼び出しを含め、その動作は未定義です。

これらのルーチンは適切な値に変換しようと試みます。

例えば、FLOATの内部表現ではテキスト結果が要求された場合、sqlite3_snprintf()は自動的に変換を実行するために内部で使用されます。

下表に実際の変換の詳細を示します。

内部の型要求された型変換
NULLINTEGER結果は0
NULLFLOAT結果は0.0
NULLTEXT結果はNULLポインタ
NULLBLOB結果はNULLポインタ
INTEGERFLOAT整数から浮動小数への変換
INTEGERTEXT整数をASCIIに翻訳
INTEGERBLOBINTEGER → TEXTと同じ
FLOATINTEGER浮動小数から整数への変換
FLOATTEXT浮動小数をASCIIに翻訳
FLOATBLOBFLOAT → TEXTと同じ
TEXTINTEGERatoi()を使用
TEXTFLOATatof()を使用
TEXTBLOB変更無し
BLOBINTEGERTEXTに変換後、atoi()を使用
BLOBFLOATTEXTに変換後、atof()を使用
BLOBTEXT必要に応じてゼロ終端を追加

上記の表にあるatoi()とatof()は標準Cライブラリの関数です。

SQLiteはこれらの関数を実際に使用するわけではなく、等価な独自の内部ルーチンを持っています。

表では簡潔に表すため、ほとんどのCプログラマに知られているatoi()とatof()という名前を使っています。

型変換が生じた場合、事前に呼び出したsqlite3_column_blob()やsqlite3_column_text()、またはsqlite3_column_text16()によって返されるポインタは無効になる場合があります。

型変換によるポインタの無効化は次の場合に発生する可能性があります。
  • 初期内容がBLOBで、sqlite3_column_text()とsqlite3_column_text16()が呼び出された場合、文字列にゼロ終端を追加する必要がある可能性があります。

  • 初期内容がUTF-8テキストで、sqlite3_column_bytes16()またはsqlite3_column_text16()が呼び出された場合、内容をUTF-16に変換する必要があります。

  • 初期内容がUTF-16テキストで、sqlite3_column_bytes()またはsqlite3_column_text()が呼び出された場合、内容をUTF-8に変換する必要があります。
UTF-16beとUTF-16le間の変換は、以前のポインタを無効にせず常にその場で行いますが、当然バッファの内容は以前のポインタの参照が変更されている前提です。

他の変換の種類は可能な時にその場所で行いますが、時々以前のポインタが無効になり不可能な場合があります。

安全で簡単に処理を忘れずに行うには、次の方法のいずれかのルーチンを呼び出してください。
  • sqlite3_column_bytes()の後にsqlite3_column_text()
  • sqlite3_column_bytes()の後にsqlite3_column_blob()
  • sqlite3_column_bytes16()の後にsqlite3_column_text16()
すなわち、sqlite3_column_text()やsqlite3_column_blob()mまたはsqlite3_column_text16()といった望む結果のフォーマットを最初に呼び出し、それからsqlite3_column_bytes()またはsqlite3_column_bytes16()を結果のサイズを確認して呼び出します。

sqlite3_column_text()またはsqlite3_column_blob()をsqlite3_column_bytes16()と、またはsqlite3_column_text16()とsqlite3_column_bytes()を混合して呼び出さないでください。

返されたポインタは上記に示した型変換の発生まで、あるいはsqlite3_step()sqlite3_reset()、またはsqlite3_finalize()の呼び出しまで有効です。

メモリ空間は文字列の保持に使用され、BLOBは自動的に解放されます。

sqlite3_column_blob()やsqlite3_column_text()などで返されたポインタをsqlite3_free()に渡さないでください。

これらのルーチンのいずれかの評価中にメモリ割り当てエラーが発生した場合は、デフォルト値を返します。

デフォルト値は、整数 0、浮動小数点 0.0、またはNULLポインタです。

続いて呼び出されるsqlite3_errcode()SQLITE_NOMEMを返します。

ObjectsConstantsFunctionsの一覧を参照してください。



参考文献

Result Values From A Query

0 CommentsPosted in SQLite





QuietControl 30 wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
10 | 2017/11 | 12
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

QuietControl 30 wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR