2011-06-16 55 views
5

ATTACH DATABASE命令可用于在sqlite数据库文件之间传输行,并允许您从数据库的表(例如,iPhone的sqlite应用程序可以附加到其他数据库?

$ sqlite3 BookLoansDB.sqlite 
sqlite> ATTACH DATABASE '/Users/.../Documents/BooksDB.sqlite' AS books_db; 
sqlite> select B.BookName, B.Pages, BL.LentTo from main.tblBookLoan BL inner join books_db.tblBook B on B.BookID = BL.BookID; 
The Client|512|Jenny 
The Pelican Brief|432|Mike 

如何从iPhone上的objective-c执行相同的操作。这种代码我没有成功:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentDirectory = [paths objectAtIndex:0]; 
const char *booksDBPath = [[documentDirectory stringByAppendingPathComponent:@"BooksDB.sqlite"] UTF8String]; 
const char *bookLoansDBPath = [[documentDirectory stringByAppendingPathComponent:@"BookLoansDB.sqlite"] UTF8String]; 
sqlite3 *bookLoansDB; 
int result = sqlite3_open(bookLoansDBPath, &bookLoansDB); 
sqlite3_stmt *attachStmt; 
NSString *attachSQL = [NSString stringWithFormat: @"ATTACH DATABASE \'%s\' AS books_db", bookLoansDBPath]; 
result = sqlite3_prepare_v2(bookLoansDB, [attachSQL UTF8String] , -1, &attachStmt, nil); 
char *errorMessage; 
result = sqlite3_exec(bookLoansDB, [attachSQL UTF8String], NULL, NULL, &errorMessage); 
sqlite3_stmt *selectStmt; 
NSString *selectSQL = @"select * from main.tblBookLoan BL inner join books_db.tblBook B on B.BookID = BL.BookID"; 
result = sqlite3_prepare_v2(bookLoansDB, [selectSQL UTF8String] , -1, &selectStmt, nil); 
// result == 1 
result = sqlite3_step(selectStmt) ; 
// result == 21 
if (result == SQLITE_ROW) 
{ 
    //do something 
} 

它可以完成吗?

+0

看你的意见后,似乎sqlite3_prepare_v2导致你有1这是SQLITE_ERROR,你应该检查sqlite3_errmsg(bookLoansDB)错误。 – Joe 2011-06-16 20:24:49

回答

0

您可以在iPhone上的sqlite中附加数据库。很难说这是怎么回事你的代码,但它应该帮助,如果它看起来更像这样一点:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentDirectory = [paths objectAtIndex:0]; 
const char *booksDBPath = [[documentDirectory stringByAppendingPathComponent:@"BooksDB.sqlite"] UTF8String]; 
const char *bookLoansDBPath = [[documentDirectory stringByAppendingPathComponent:@"BookLoansDB.sqlite"] UTF8String]; 
sqlite3 *bookLoansDB; 
if (sqlite3_open(bookLoansDBPath, &bookLoansDB) == SQLITE_OK) { 
    NSString *attachSQL = [NSString stringWithFormat: @"ATTACH DATABASE \'%s\' AS books_db", bookLoansDBPath]; 
    char *errorMessage; 
    if (sqlite3_exec(bookLoansDB, [attachSQL UTF8String], NULL, NULL, &errorMessage) == SQLITE_OK && errorMessage == nil) { 
     sqlite3_stmt *selectStmt; 
     NSString *selectSQL = @"select * from main.tblBookLoan BL inner join books_db.tblBook B on B.BookID = BL.BookID"; 
     if (sqlite3_prepare_v2(bookLoansDB, [selectSQL UTF8String] , -1, &selectStmt, nil) == SQLITE_OK) { 
      while (sqlite3_step(selectStmt) == SQLITE_ROW) { 
       //process row 
      } 
     } 
     else { 
      NSLog(@"Error while creating select statement: '%s'", sqlite3_errmsg(bookLoansDB)); 
     } 
    } 
    else { 
     NSLog(@"Error while attaching databases: '%s'", errorMessage); 
    } 
} 
else { 
    NSLog(@"Failed to open database at %@ with error %s", booksDBPath, sqlite3_errmsg(bookLoansDB)); 
    sqlite3_close(bookLoansDB); 
} 

我没有测试此代码,只需修改你的,所以它可能需要修正。

+0

谢谢。使用此代码给出了:创建select语句时出现错误:'no such table:books_db.tblBook' 令人沮丧的SQL命令行中使用相同的SQL sqlite示例 – Nick 2011-06-16 21:41:42

6

我已经得到了工作示例(将我的数据库名称混入“附加数据库”SQL中)。所以是的,它可以做到。感谢您指点我正确的方向Deepmist

由于这样的例子很难找到,我粘贴了下面的工作版本。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentDirectory = [paths objectAtIndex:0]; 
const char *booksDBPath = [[documentDirectory stringByAppendingPathComponent:@"BooksDB.sqlite"] UTF8String]; 
const char *bookLoansDBPath = [[documentDirectory stringByAppendingPathComponent:@"BookLoansDB.sqlite"] UTF8String]; 
sqlite3 *bookLoansDB; 
if (sqlite3_open(bookLoansDBPath, &bookLoansDB) == SQLITE_OK) { 
    NSString *attachSQL = [NSString stringWithFormat: @"ATTACH DATABASE \'%s\' AS books_db", booksDBPath]; 
    char *errorMessage; 
    if (sqlite3_exec(bookLoansDB, [attachSQL UTF8String], NULL, NULL, &errorMessage) == SQLITE_OK) { 
     sqlite3_stmt *selectStmt; 
     NSString *selectSQL = @"select * from main.tblBookLoan BL inner join books_db.tblBook B on B.BookID = BL.BookID"; 
     if (sqlite3_prepare_v2(bookLoansDB, [selectSQL UTF8String] , -1, &selectStmt, nil) == SQLITE_OK) { 
      int n=0; 
      while (sqlite3_step(selectStmt) == SQLITE_ROW) { 
       //do something 
      } 
     } 
     else { 
      NSLog(@"Error while creating select statement: '%s'", sqlite3_errmsg(bookLoansDB)); 
     } 
    } 
    else { 
     NSLog(@"Error while attaching databases: '%s'", errorMessage); 
    } 
} 
else { 
    NSLog(@"Failed to open database at %@ with error %s", booksDBPath, sqlite3_errmsg(bookLoansDB)); 
    sqlite3_close(bookLoansDB); 
} 
相关问题