2017-08-13 9 views
0

私は、そのデータをMetakit 2.4.9.7データベースに保存するRaspberry Pi 3用の組み込みアプリケーションを開発しています。テーブルの1つは2つの列(データ型:double + string)で構成されています。 double値は問題なく保存されますが、データベースでCommit()メソッドを呼び出すと、文字列値は明白に破棄されます。 (第2ループの実行に対しちょうどコミットした後、列#1(ダブル)及び#2(文字列):コミット後にMetakitが文字列値を格納しないのはなぜですか?

#include <iostream> 
#include <map> 
#include <mk4.h> 
#include "database.h" 

using namespace std; 

database::database (string file_name) 
: connection_handler (file_name.c_str(), 1), 
    table_tracks  (connection_handler.GetAs ("tracks [degrees:D, compass:S]")) 
{ 
    cout << "Opening database " << file_name << "." << endl; 

    if (table_tracks.GetSize() == 0) { 
    c4_DoubleProp degrees ("degrees"); 
    c4_StringProp compass ("compass"); 
    c4_Row  track; 
    int   i; 
    string  compass_points [17] = {"N", "NNE", "NE", "ENE", 
             "E", "ESE", "SE", "SSE", 
             "S", "SSW", "SW", "WSW", 
             "W", "WNW", "NW", "NNW", 
             "N"}; 

    cout << "Database is vanilla. Setting it up now." << endl; 

    for (i = 0; i <= 16; i++) { 
     degrees (track) = 22.5 * (double) i; 
     compass (track) = (compass_points [i]).c_str(); 

     table_tracks.Add (track); 
    } 

    for (i = 0; i < table_tracks.GetSize(); i++) { 
     cout << (double) degrees (table_tracks [i]) << " " << (string) compass (table_tracks [i]) << endl; 
    } 

    connection_handler.Commit(); 

    for (i = 0; i < table_tracks.GetSize(); i++) { 
     cout << (double) degrees (table_tracks [i]) << " " << (string) compass (table_tracks [i]) << endl; 
    } 
    } 
} 

最初のループは私の以前のデータで満たされたテーブルの完全な内容を与える:このコードを参照してください。 )呼び出しは#1の内容を与えるだけで、#2が一度も入力されていないかのようになります。

ここで何が間違っていますか?有用なヒントがあれば幸いです。

答えて

0

Metakit Googleグループを閲覧した後、私は自分自身のヒントを得ました。これは、特に、トラブルを作った定義文字列、中括弧内のもののコード行だった:

connection_handler.GetAs ("tracks [degrees:D, compass:S]"); 

すでに列にコロンの後に空白スペースについて2008年3月に、ユーザーの苦情がありました私のケースでは、列定義を区切るカンマの後に空白がありました。 APIのドキュメントにはこれに関するヒントはありませんでした。空白を取り除いてデータベースを再構築した後、すべてが突然うまくいきました。 :)

関連する問題