1

可能重复:
我应该如何在 iPhone 项目中指定 sqlite db 的路径?

我想知道为什么我只能在 iphone 上读取我的 Sqlite 数据库但不能写任何东西......在模拟器上一切正常......

是否有任何配置来设置权限或什么?

PS:当我更新或插入sqlite(从设备)时没有错误。

这是我的代码(打开 sqlite):

- (id)init {
    if ((self = [super init])) {
        NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"test"
                                                             ofType:@"sqlite"];

        if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
            NSLog(@"Failed to open database!");
        }
    }
    return self;
}

@end

和我的“更新”代码:

-(void)addCoin:(int)score
{
    NSString *query = @"select coin_user from user where id_user = '1'";
    //query = @"SELECT id_soal FROM soal where jawaban_soal = 'romin'";

    sqlite3_stmt *statement;
    int total;
    if (sqlite3_prepare(_database, [query UTF8String], -1, &statement, nil)
        == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            total = sqlite3_column_int(statement, 0);
        }
        sqlite3_finalize(statement);
    }

    query = [NSString stringWithFormat:@"update user set coin_user = '%i' where id_user = '1'",total + score];

    if (sqlite3_prepare(_database, [query UTF8String], -1, &statement, nil)
        == SQLITE_OK) {
        sqlite3_step(statement);
        sqlite3_finalize(statement);
        }

}
4

2 回答 2

4

你不能写在你的主包中。您可以将数据保存到文档目录
您必须将数据库复制到文档目录,然后必须对文档目录中的数据库文件执行操作。

将此代码放在应用程序委托中以复制您的数据库

NSString* docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* dbPath = [docPath stringByAppendingPathComponent:@"test.sqlite"];
NSFileManager *fm = [NSFileManager defaultManager];

// Check if the database is existed.
if(![fm fileExistsAtPath:dbPath])
{
    // If database is not existed, copy from the database template in the bundle
    NSString* dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"sqlite"];
    NSError* error = nil;
    [fm copyItemAtPath:dbTemplatePath toPath:dbPath error:&error];  
        if(error){
            NSLog(@"can't copy db.");
        }
}

和init方法

- (id)init {
    if ((self = [super init])) {
            NSString* docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
            NSString* dbPath = [docPath stringByAppendingPathComponent:@"test.sqlite"];

           if (sqlite3_open([dbPath UTF8String], &_database) != SQLITE_OK) {
               NSLog(@"Failed to open database!");
           }
    }
    return self;
}
于 2013-02-04T08:31:05.700 回答
-1

您可以在任何地方创建您的 sqlite 数据库并提供数据库的路径。这对你来说很容易。检查下面给出的代码

{
        sqlite3_stmt *statement;

        NSString *lmk= @"Volumes/Outbox/test.sqlite";
        const char *dbpath=[lmk UTF8String];

        if (sqlite3_open(dbpath, &contactDB3)==SQLITE_OK)
        {
            NSLog(@"Database is connected sucessfully");
        }
            else
                NSLog(@"Not connected");
            sqlite3_close(contactDB3);
}

现在您可以轻松地选择插入更新删除。

于 2013-02-04T08:54:02.150 回答