0

更多 SQLite 问题。所以我的界面如下(都是.m):

@interface Search()
    @property (strong, nonatomic) NSString *databasePath; //path to sqlite database file
    @property (strong, nonatomic) NSString *databaseName;
    @property (nonatomic) sqlite3 *database;
@end

初始化如下:

- (id)init
{
    if ((self = [super init]))
    {
        self.databaseName = DB_NAME;

        NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDir = [documentPaths objectAtIndex:0];
        _databasePath = [documentsDir stringByAppendingPathComponent:self.databaseName];
        [self checkAndCreateDatabase];
        if (sqlite3_open_v2([self.databasePath UTF8String], &_database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK)
        {
            [[[UIAlertView alloc]initWithTitle:@"Missing"
                                       message:@"Database file not found"
                                      delegate:nil
                             cancelButtonTitle:@"OK"
                             otherButtonTitles:nil, nil]show];
        }
        else
        {
            NSLog(@"%s: sqlite3_open_v2 error: %s", __FUNCTION__, sqlite3_errmsg(self.database));
        }
    }

init 中的 Log 返回的错误是:sqlite3_open_v2 error: not an error. 在我的搜索中,我听说 SQLite 在指向不存在的数据库时不会返回错误。但我不确定为什么数据库不存在。我正在使用的复制功能(我被赋予并且之前似乎工作过)如下:

-(void) checkAndCreateDatabase
{
    // Check if the SQL database has already been saved to the users phone, if not then copy it over
    BOOL dbExists;

    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];

    // Check if the database has already been created in the users filesystem
    dbExists = [fileManager fileExistsAtPath:_databasePath];

    // If the database already exists then return without doing anything
    if(dbExists)
    {
        return;
    }
    // If not then proceed to copy the database from the application to the users filesystem

    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:_databaseName];

    // Copy the database from the package to the users filesystem
    //[fileManager copyItemAtPath:databasePathFromApp toPath:_databasePath error:nil];
    NSError *error = nil;
    if (![fileManager copyItemAtPath:databasePathFromApp toPath:_databasePath error:&error])
    {
        NSLog(@"%s: copyItemAtPathError: %@", __FUNCTION__, error);
    }
}

最后,我在 iOS Simulator Documents 目录中验证了该数据库存在,并且我尝试对其执行的查询有效。为什么我会收到此错误?

4

2 回答 2

3

从来没有像这样使用过 SQLLite,我只想提一下,在上面的代码中,你的 else 语句被调用,when sqlite_open_v2 == SQL_OK。所以也许在那种情况下,没有错误可以返回,一切都很好?!

于 2013-06-22T17:54:00.207 回答
0

事实证明,这个问题非常简单。我试图将值分配给(然后从中提取)的对象未初始化。对我来说,这是一个非常愚蠢的疏忽,但我对 Objective C 还是很陌生。

此外,我确实推荐 icodebuster 的建议,以在 iOS 中使用 FMDB for SQLite。它清理了我的一些 SQLite 混乱并使它更好用。

于 2013-06-24T03:53:14.373 回答