gpt4 book ai didi

iphone - 将数据插入 SQLite db iPhone 的正确方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:19:46 24 4
gpt4 key购买 nike

如何在 sqlite iPhone 中向表中插入数据?

我正在尝试跟随,但失败了:

 NSString *query=[NSString stringWithFormat:@"insert into %@ (name) values ('%@')", table name,myName ];


sqlite3 *database;

sqlite3_stmt *createStmt = nil;

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
if (createStmt == nil) {

if (sqlite3_prepare_v2(database, [query UTF8String], -1, &createStmt, NULL) != SQLITE_OK) {
return NO;
}
sqlite3_exec(database, [query UTF8String], NULL, NULL, NULL);
return YES;
}

return YES;
}else {
return NO;
}

我按以下方式创建了表:

create table if not exists myDets (dets_id integer primary key asc, name text);

我也在使用 Firefox SQLite 插件来检查数据库。当我尝试通过 firefox 将记录插入我的数据库时,出现以下错误:

Failed to insert values
Exception Name: NS_ERROR_STORAGE_IOERR
Exception Message: Component returned failure code: 0x80630002 (NS_ERROR_STORAGE_IOERR) [mozIStorageStatement.execute]

严重卡住:(

此外,我在 iPhone 模拟器上运行它,这有关系吗?

请帮忙

提前致谢。

最佳答案

  • 使用参数而不是字符串格式化你的更新语句
  • 添加大量跟踪、检查返回代码并检查错误代码(您的问题不清楚是什么错误,您在 iPhone 上遇到的问题)。
  • 使用 sqlite3_errmsg 获取错误信息
  • 构建您的 dbPath 并将其注销。确保您可以从模拟器下的终端打开数据库。请记住,sqlite 将在内存中被动地创建一个数据库,因此如果您的路径关闭并且数据库不存在,它可能会造成混淆。
  • 打印出您的更新语句,并在您记录的路径中的终端中的 sqlite cmdline 应用程序中尝试它。
  • 如果您将数据库放在主捆绑资源中,它是一个模板,需要复制才能打开和写入它。

这是我的示例中的更新函数:

- (void)updateContact: (Contact*)contact error:(NSError**)error
{
if (![self ensureDatabaseOpen:error])
{
return;
}

NSLog(@">> ContactManager::updateContact");

// prep statement
sqlite3_stmt *statement;
NSString *querySQL = @"update contacts set name=?,address=?,phone=? where id=?";
NSLog(@"query: %@", querySQL);
const char *query_stmt = [querySQL UTF8String];

// preparing a query compiles the query so it can be re-used.
sqlite3_prepare_v2(_contactDb, query_stmt, -1, &statement, NULL);
sqlite3_bind_text(statement, 1, [[contact name] UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_text(statement, 2, [[contact address] UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_text(statement, 3, [[contact phone] UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_int64(statement, 4, [[contact id] longLongValue]);

NSLog(@"bind name: %@", [contact name]);
NSLog(@"bind address: %@", [contact address]);
NSLog(@"bind phone: %@", [contact phone]);
NSLog(@"bind int64: %qi", [[contact id] longLongValue]);

// process result
if (sqlite3_step(statement) != SQLITE_DONE)
{
NSLog(@"error: %s", sqlite3_errmsg(_contactDb));
}

sqlite3_finalize(statement);
}

在示例中,数据库从资源复制到路径并打开。这是我用来执行此操作的确保打开的功能:

- (BOOL)ensureDatabaseOpen: (NSError **)error
{
// already created db connection
if (_contactDb != nil)
{
return YES;
}

NSLog(@">> ContactManager::ensureDatabaseOpen");
if (![self ensureDatabasePrepared:error])
{
return NO;
}

const char *dbpath = [_dbPath UTF8String];
if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK &&
error != nil)
{
*error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease];
return NO;
}

NSLog(@"opened");

return YES;
}

- (BOOL)ensureDatabasePrepared: (NSError **)error
{
// already prepared
if ((_dbPath != nil) &&
([[NSFileManager defaultManager] fileExistsAtPath:_dbPath]))
{
return YES;
}

// db in main bundle - cant edit. copy to library if !exist
NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"];
NSLog(@"%@", dbTemplatePath);

NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
_dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"];

NSLog(@"dbPath: %@", _dbPath);

// copy db from template to library
if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
{
NSLog(@"db not exists");
NSError *error = nil;
if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error])
{
return NO;
}

NSLog(@"copied");
}

return YES;
}

关于iphone - 将数据插入 SQLite db iPhone 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10424043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com