2012-05-06 41 views
5

Tôi muốn sao chép bảng từ aDB sang bDB khác.Sao chép bảng trong một db sang một db

Vì vậy, tôi đã thực hiện một phương pháp. Tôi nghĩ rằng mở 2 cơ sở dữ liệu và sử dụng truy vấn chèn sẽ làm việc nhưng tôi không biết cách chi tiết.

-(void)copyDatabaseTableSoruceFileName:(NSString *)source CopyFileName:(NSString *)copy 
{ 
sqlite3 *sourceDatabase=NULL; 
sqlite3 *copyDatabase=NULL; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 
NSString* documentDir = [paths objectAtIndex:0]; 

//source 
    [self copyFileIfNeed:source path:documentDir]; 

NSString *SourceDBPath = [documentDir stringByAppendingPathComponent:source]; 
if(sqlite3_open([SourceDBPath UTF8String],&sourceDatabase)!= SQLITE_OK) 
{ 
    NSLog(@"DB File Open Error :%@", SourceDBPath); 
    sourceDatabase = NULL; 
} 
//copy  
[self copyFileIfNeed:copy path:documentDir]; 

NSString *CopyDBPath = [documentDir stringByAppendingPathComponent:copy]; 
if(sqlite3_open([CopyDBPath UTF8String],&copyDatabase)!= SQLITE_OK) 
{ 
    NSLog(@"DB File Open Error :%@", CopyDBPath); 
    copyDatabase = NULL; 
} 

//source to copy 


// How in this area? 


} 

Có đúng không? và làm thế nào để làm nhiều hơn? // nguồn để sao chép khu vực.

Trả lời

21

trong sqlite3, bạn có thể kết hợp các ATTACH [1] và CREATE TABLE .. AS [2] lệnh:

đầu tiên, bạn đang mở "BDB" cơ sở dữ liệu, và sau đó thực hiện các tuyên bố sau:

ATTACH DATABASE "myother.db" AS aDB; 

Sau đó, bạn có thể sử dụng CREATE TABLE cú pháp:

CREATE TABLE newTableInDB1 AS SELECT * FROM aDB.oldTableInMyOtherDB; 

này sẽ "sao chép" các dữ liệu trên cơ sở dữ liệu mới của bạn. Nếu bạn muốn kết hợp các dữ liệu, đó cũng là một INSERT [3] tuyên bố, nhưng với điều đó, bạn sẽ cần phải tham khảo các lĩnh vực của bạn như thế này:

INSERT INTO newtable (field1,field2) 
    SELECT otherfield1,otherfield2 FROM aDB.oldTableInMyOtherDB; 

Tài liệu tham khảo:

[1] http://www.sqlite.org/lang_attach.html

[2] http://www.sqlite.org/lang_createtable.html

[3] http://www.sqlite.org/lang_insert.html

+1

+1 để nhắc tôi tạo và sao chép bảng nhanh bằng "TẠO TẠO newTableInDB1 AS SELECT * FROM aDB.oldTableInMyOtherDB;" –

+0

cũng được giải thích. nó sẽ là tuyệt vời nếu bạn có thể viết trong mã bê tông ios objc. – OMGPOP

+0

Các lệnh là SQL thuần túy, bạn thực hiện chúng với một lệnh gọi tới sqlite3_exec(). – Zuppa

0

Sau giờ str ồ ạt trên SO, và với sự giúp đỡ của bài viết trên, Cuối cùng tôi đã có thể tạo mã Objective-C để làm điều này.

NSString* dbPath1; 
NSString* dbPath2; 

dbPath1 = [self getDB1Path]; //This db have the desired table to be copied 
dbPath2 = [self getDB2Path]; //This needs to have the desired table 

//open database which contains the desired "table" 
if (sqlite3_open(dbPath1.UTF8String, &databasePhase2) == SQLITE_OK) 
{ 
    NSString *attachSQL = [NSString stringWithFormat: @"ATTACH DATABASE \"%@\" AS phase2_db",dbPath2]; 

    const char *attachSQLChar = [attachSQL UTF8String]; 
    char* errInfo; 
    int result = sqlite3_exec(databasePhase2, attachSQLChar, nil, nil, &errInfo); 

    if (SQLITE_OK == result) 
    { 
     NSLog(@"new db attached"); 
     NSString *attachSQL = [NSString stringWithFormat: @"CREATE TABLE newTableInDB1 AS SELECT * FROM phase2_db.qmAyahInfo"]; 

     const char *createSQLChar = [attachSQL UTF8String]; 
     int result2 = sqlite3_exec(databasePhase2, createSQLChar, nil, nil, &errInfo); 
     if (SQLITE_OK == result2) 
     { 
      NSLog(@"New table created in attached db"); 
     } 
    } 
    sqlite3_close(databasePhase2); 
} 
+0

Đừng quên tách cơ sở dữ liệu bằng cách mở lại cơ sở dữ liệu phase2_db, trong trường hợp bạn không chỉ đóng nó. – Zuppa

Các vấn đề liên quan