目标c-iPhone sqlite应用程序可以连接到其他数据库吗


ATTACH DATABASE命令可用于在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
}

能做到吗?

我已经完成了这个例子(在"attach-database"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);
}

您可以在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);
}

我还没有测试这个代码,只是修改了你的代码,所以它可能需要修复。

最新更新