Xcode无法识别本地数据库。似乎无法连接到sqlite3数据库文件

时间:2012-07-01 23:16:04

标签: iphone database xcode login sqlite

我正在尝试将我称为Login.sql的sqlite3数据库文件连接到我写的iphone appilcation。即使我尝试在几个地方放入Xcode,包括Documents文件夹,包含xcode项目的文件夹,以及项目的Dervived Data,Xcode似乎也没有重新整理文件。以下代码位于didFinishLaunchingWithOptions下的AppDelegate文件中(它曾经在View Controller中,但我认为它可以工作。

这是代码:        NSString * docsDir;

NSArray *dirPaths;

// databaseName = [[NSBundle mainBundle] pathForResource:@"DBLogin.sql" ofType:@"db"];

databaseName= @"Login.sql";

// Get the documents directory

dirPaths = NSSearchPathForDirectoriesInDomains(

                                               NSDocumentDirectory, NSUserDomainMask, YES);



docsDir = [dirPaths objectAtIndex:0];


NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDir = [documentPaths objectAtIndex:0];

databasePath = [documentsDir stringByAppendingPathComponent:databaseName];



// Build the path to the database file

//databasePath = [[NSString alloc]                     initWithString: [docsDir stringByAppendingPathComponent:                                     @"DBLogin.sql"]];



NSFileManager *filemgr = [NSFileManager defaultManager];



if ([filemgr fileExistsAtPath: databasePath ] == NO)

{


    const char *dbpath = [databasePath UTF8String];





    if (sqlite3_open(dbpath, &database) == SQLITE_OK)

    {

        NSLog(@"DATABASE LOADED");

        char *errMsg;

        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS User (id varchar(20) PRIMARY KEY , password varchar(20))";



        if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)

        {

            status.text = @"Failed to create table";

        }



        status.text = @"Database Connected";



        sqlite3_close(database);



    } else {

        status.text = @"Failed to open/create database";

    }

}

else{

    NSLog(@"Connect!");

}




return YES;

接受数据库文件的代码在这里:Xcode login screen sqlite3 database authentication issue我只是包含它以防这个代码可能导致问题。

基本上每次我在这段代码中放置一个新的数据库来查看是否存在问题我认为代码会创建一个新的临时sql数据库文件,并且在表中创建的表不存在函数。我不知道该怎么做,这让我发疯。如果有人知道如何让这些代码识别我的数据库,我们将不胜感激。我已将数据库链接到复制包资源构建页面,但它仍然无法访问它。

如果您需要任何其他信息,请与我们联系。

提前致谢!

2 个答案:

答案 0 :(得分:3)

我将为您提供访问sqlite3数据库的步骤。

1。首先我创建一个带有必需表的空白sqlite数据库(使用firefox sqlite manager附加组件或任何其他方便的方法)。并将其添加到我的项目中。

2. 获取数据库文件的路径。

BOOL success;

NSArray*dirPath;
NSString*docDir;
NSString*databasePath;
NSString*databaseName=@"yourDB.sqlite";

//path for database
dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docDir=[dirPath objectAtIndex:0];
databasePath=[docDir stringByAppendingPathComponent:databaseName];

3。使用NSFileManager检查DocumentDirectory中是否已有。如果它不存在(在第一次运行中),请将其替换为捆绑中保存的数据库(从第一步开始)。

//check if present
NSFileManager*fm=[NSFileManager defaultManager];
success=[fm fileExistsAtPath:databasePath];

if(success)
{
   NSLog(@"Already present");
}
else
{

   //Copy from bundle to DocumentsDirectory on first run. Where DB won't be available in DocumentsDirectory.
      NSString*bundlePath=[[NSBundle mainBundle] pathForResource:@"yourDB" ofType:@"sqlite"];
NSError*error;
success=[fm copyItemAtPath:bundlePath toPath:databasePath error:&error];

 if(success)
 {
     NSLog(@"Created successfully");
 }

} // End of else when DB not present in documents directory.

执行此操作后,您将在捆绑包中手动添加到文档目录中的空白数据库,并且将对其执行所有更改(不在捆绑包上)。在此之后,您可以继续执行其余的sqlite3数据库操作功能。

修改:访问数据库的方法

这是我用来从DB中检索值的方法,只需尝试一下。

if(sqlite3_open([dbpath UTF8String], &database)==SQLITE_OK) //Check if it opens properly
{
    NSString*queryStmt=[NSString stringWithFormat:@"select * from sometable"];
    const char*querystmt=[queryStmt UTF8String];
    sqlite3_stmt *statement;

  if(sqlite3_prepare(database, querystmt, -1, &statement, NULL)==SQLITE_OK) // Check if prepare statment has no issues
    {
        while(sqlite3_step(statement)==SQLITE_ROW) // Consists of row.
        {
            NSString*thestring=[[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 0)];// 0 will be first column
            NSLog(@"%@",thestring);
        }

        sqlite3_finalize(statement); //finalize statement
    }

    sqlite3_close(database); //Close database
}

答案 1 :(得分:0)

问题可能是您的数据库扩展,创建一个名为Login.sqlite而不是Login.sql的数据库,因为iPhone sqlite3框架只识别.sqlite个数据库。

然后您编码的内容将起作用。