まず第一に、私はここに来たばかりなので、私のプロジェクトで私を大いに助けてくれたコミュニティに感謝したいと思います.
私は実際に、ローカルの sqlite db から顧客情報を提供する必要があるアプリケーションに取り組んでいます。
私は次のことをしました:
アプリケーションの起動時にsqliteデータベースをコピーします(ドキュメントフォルダーにデータベースが存在しない場合)
ユーザーがインターフェイスで更新を要求すると、メソッドが呼び出され、データベースの customer_information テーブルに入力されます。
ユーザーがメイン画面に戻ると、メソッドが呼び出され、sqlite データベースの値に従って表示される情報が更新されます。
問題は、値が表示されないことです。XCode は私のコードにエラーを見つけることができず、値を挿入するためにさまざまな方法を試しても、どこに問題があるのか わかりません。
よろしくお願いします。英語が下手で申し訳ありません。私はフランス人です。
心から。
私のソース コードから次の抜粋を見つけてください。
ドキュメントフォルダーにデータベースをコピーする
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSError *emsg;
BOOL fileExist;
//Get list of directories in Document path
NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//Define new path for database
NSString *documentPath = [[dirPath objectAtIndex:0] stringByAppendingPathComponent:@"Vidagen_ios.sqlite"];
// Path of db in the application
NSString *origin = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Vidagen_ios.sqlite"];
fileExist = [[NSFileManager defaultManager] fileExistsAtPath:documentPath];
if(!fileExist){
[[NSFileManager defaultManager] copyItemAtPath:origin toPath:documentPath error:&emsg];
NSLog(@"db copied");
}
// Override point for customization after application launch.
return YES;
}
更新方法
- (void)insertRecords
{
sqlite3_stmt *sqlStatement = nil;
sqlite3 *newDb;
// Request
const char *sql = "INSERT INTO client_information(client_info_id, client_info_name, client_info_sex, client_info_age, client_info_id_card, client_info_tel, client_info_tall, client_info_weight, client_info_address, client_info_email, client_info_pwd, client_info_client_source_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
// Path of copied db
NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *database = [[dirPath objectAtIndex:0] stringByAppendingPathComponent:@"Vidagen_ios.sqlite"];
// db sequence
if(sqlite3_open([database UTF8String], &newDb) == SQLITE_OK){
NSLog(@"ouverture de la base ok");
for (int i=0; i<11; i++) {
sqlite3_bind_text(sqlStatement, i, [[NSString stringWithFormat:@"Test"] UTF8String], -1, SQLITE_TRANSIENT);
}
sqlite3_bind_int(sqlStatement, 11, 1);
sqlite3_prepare_v2(newDb, sql, 1, &sqlStatement, NULL);
if (sqlite3_step(sqlStatement) == SQLITE_OK) {
NSLog(@"client ajouté");
} else{
NSLog(@"Echec d'ajout");
}
sqlite3_step(sqlStatement);
sqlite3_finalize(sqlStatement);
sqlite3_close(newDb);
};
}
ここで、ステップが「SQLITE_OK」とは異なることに気付きました。
情報の表示方法
- (void)viewDidLoad
{
infoCustomer = [[CustomerDAO alloc] init];
if([[infoCustomer getCurrentCustomer] count] > 0){
self.customer = [[infoCustomer getCurrentCustomer] objectAtIndex:0];
[self.uniqueId setText:self.customer.uniqueId];
[self.name setText:self.customer.name];
[self.sex setText:self.customer.sex];
[self.tall setText:self.customer.tall];
[self.weight setText:self.customer.weight];
[self.age setText:self.customer.age];
[self.address setText:self.customer.address];
[self.tel setText:self.customer.tel];
[self.email setText:self.customer.email];
} else{
NSLog(@"customer not read");
[self.uniqueId setText:@"Go to Update."];
[self.name setText:@""];
[self.sex setText:@""];
[self.tall setText:@""];
[self.weight setText:@""];
[self.age setText:@""];
[self.address setText:@""];
[self.tel setText:@""];
[self.email setText:@""];
}
[super viewDidLoad];
// Do any additional setup after loading the view.
}
編集 :
昨日から研究を続けましたが、ソースコードに何か問題がありました:
sqlite3_prepare_v2(newDb, sql, 1, &sqlStatement, NULL);
3 番目のパラメータは、リクエストの長さを定義しているため、-1 に変更する必要があります。sqlite リクエストを学習するためにいくつかのチュートリアルを使用しましたが、見たすべてのパラメーターを理解するのに実際には時間を費やしませんでした。-1 として定義すると、実行時に長さが自動計算されることを意味します。
何度もミスをして負けて悔しい思いをして、経験も外見も無い中で仕事をすることの大変さを教えてもらいました。