Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read Int64 values from sqlite database?

My table and row look like below;

Table : Visit
Column : VisitDate
Value : 634993344000000000 

VisitDate column holds an Int64 value (such as DateTime.Now.Ticks)

while I am reading this from database, SQLite cannot detect whether column is Int64 value. My code is;

switch (sqlite3_column_type(statement,i))
      {
         case SQLITE_INTEGER:
                intValue  = (int)sqlite3_column_int(statement, i);
                colNameChar = (const char *)sqlite3_column_name(statement, i);
                colName =  [NSString stringWithCString:colNameChar encoding:NSUTF8StringEncoding];
                colValue = [NSNumber numberWithInteger: intValue];
                break;
        case SQLITE_FLOAT:
                dblValue = (double)sqlite3_column_double(statement, i);
                colNameChar = (const char *)sqlite3_column_name(statement, i);
                colName =  [NSString stringWithCString:colNameChar encoding:NSUTF8StringEncoding];
                colValue  = [NSNumber numberWithDouble: dblValue];
                break;
         case SQLITE_TEXT:
                 strValue = (const char *)sqlite3_column_text(statement, i);
                 colNameChar = (const char *)sqlite3_column_name(statement, i);
                 colName =  [NSString stringWithCString:colNameChar encoding:NSUTF8StringEncoding];
                 colValue = [NSString stringWithCString:strValue encoding:NSUTF8StringEncoding];
                        break;
          case SQLITE_BLOB:
                  strValue = (const char *)sqlite3_column_value(statement, i);
                  colNameChar = (const char *)sqlite3_column_name(statement, i);
                  colName =  [NSString stringWithCString:colNameChar encoding:NSUTF8StringEncoding];
                  colValue = [NSString stringWithCString:strValue encoding:NSUTF8StringEncoding];
                  break;
           case SQLITE_NULL:
                  strValue = nil;
                  colNameChar = (const char *)sqlite3_column_name(statement, i);
                  colName =  [NSString stringWithCString:colNameChar encoding:NSUTF8StringEncoding];
                  colValue = [[NSObject alloc] init];
                  break;
            default:
                   strValue = (const char *)sqlite3_column_value(statement, i);
                   colNameChar = (const char *)sqlite3_column_name(statement, i);
                   colName =  [NSString stringWithCString:colNameChar encoding:NSUTF8StringEncoding];
                   colValue = [NSString stringWithCString:strValue encoding:NSUTF8StringEncoding];
                    break;
       }    

Debugger enters case of SQLITE_INTEGER and produces a garbage value (something like -2323423). How can I get correct value?

like image 801
Mehmet Ince Avatar asked Jan 18 '26 16:01

Mehmet Ince


1 Answers

In SQLite, all integer values are 64-bit values. It is common to use sqlite3_column_int only because most applications already know that their values do fit into 32 bits (or have copy-pasta'd that code from some other application that made this assumption).

If you want to check whether a SQLITE_INTEGER value will fit into 32 or 64 bits, you have to call sqlite3_column_int64 first and check the result.

like image 167
CL. Avatar answered Jan 20 '26 23:01

CL.