首先,我是新来的,所以我要感谢在我的项目中帮助了我很多的社区。 p>
我实际上正在处理一个必须从本地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);
};
}
我注意到这个步骤与&#34; SQLITE_OK&#34;不同。
显示信息的方法
- (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);
第三个参数必须更改为-1,因为它定义了 我的要求的长度。我用了一些教程来学习sqlite 请求,我没有真正花时间去理解所有的 我看到的参数。如果将其定义为-1,则表示长度将为 在运行时自动计算。
我觉得因为这么多错误而失去这么多时间感到很沮丧 如何没有足够的经验或没有外部工作是如何工作的 意见。