你在你的包打開數據庫。該軟件包在設備上是隻讀的。您必須將數據庫複製到您的Documents
文件夾(如果它不存在那裏)並從那裏打開它。
另請注意,您正在處理數據庫的多個副本(項目中的一個,捆綁中的一個,現在位於設備/模擬器的Documents
文件夾中)。確保您檢查在正確的數據庫插入的記錄(一個在Documents
)
順便說一句,你也應該檢查,看看sqlite3_prepare_v2
返回SQLITE_OK
,如果沒有,請登錄sqlite3_errmsg
。
您還應該使用使用sqlite3_bind_text
在SQL ?
佔位符和綁定值(或者,如果它是可能nil
,sqlite_bind_null
):
- (void)saveData:(NSString *)_Id
{
sqlite3_stmt *statement;
NSString *bundlePath = [[[NSBundle mainBundle] resourcePath ] stringByAppendingPathComponent:@"data.db"];
NSString *documentsFolder = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *documentsPath = [documentsFolder stringByAppendingPathComponent:@"data.db"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:documentsPath isDirectory:NO]) {
NSError *error;
if (![fileManager copyItemAtPath:bundlePath toPath:documentsPath error:&error]) {
NSLog(@"database copy failed: %@", error);
}
}
const char *dbpath = [documentsPath UTF8String];
if (sqlite3_open(dbpath, &db) == SQLITE_OK) {
const char *insertSql = "INSERT INTO MyTable (id) VALUES (?)";
if (sqlite3_prepare_v2(db, insertSql, -1, &statement, NULL) != SQLITE_OK) {
NSLog(@"prepare error: %s", sqlite3_errmsg(db));
}
// bind a value to the ? placeholder in the SQL
if (_Id) {
if (sqlite3_bind_text(statement, 1, [_Id UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK) {
NSLog(@"bind text error: %s", sqlite3_errmsg(db));
}
} else {
if (sqlite3_bind_null(statement, 1) != SQLITE_OK) {
NSLog(@"bind null error: %s", sqlite3_errmsg(db));
}
}
if (sqlite3_step(statement) == SQLITE_DONE) {
NSLog(@"DONE");
} else {
NSLog(@"Failed to add contact: %s", sqlite3_errmsg(db));
}
sqlite3_finalize(statement);
sqlite3_close(db);
}
}
大多數人動,「如果數據庫中沒有在文件存在,然後從包中複製它並從那裏打開「專用openDatabase
方法內的邏輯,但希望這可以說明這個想法。
來源
2014-06-30 19:42:04
Rob
是的,回去並確保你檢查所有的錯誤代碼。並且要明白,100個症狀中有99個是由於SQL文件不在您認爲的位置所致。 –
(使用命令行中的sqlite3來檢查您的數據庫。) –
@KhoaNN您看到「完成」但未看到結果的原因可能是因爲該軟件包是隻讀的。您必須將數據庫複製到Documents文件夾(如果尚未存在),然後使用該數據庫。 – Rob