2012-05-06 17 views
5

Tabloyu aDB'den başka bir bDB'ye kopyalamak istiyorum.Tablo bir db diğerine kopyalanıyor db

Bu yüzden bir yöntem yaptım. Açık 2 veritabanını ve Ekleme sorgusunu kullanmanın işe yarayacağını düşünüyorum, ancak ayrıntı yolunu bilmiyorum.

-(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? 


} 

ve daha fazla nasıl yapılır? // kopyalanacak alan. sqlite3 içinde

cevap

21

, sen [1] ATTACH ve [2] komutları GİBİ .. CREATE TABLE birleştirebilirsiniz: Aşağıdaki ifadeyi

ilk siz "BDB" veritabanını açıyoruz ve sonra çalıştırın:

yeni veritabanına üzerinde

CREATE TABLE newTableInDB1 AS SELECT * FROM aDB.oldTableInMyOtherDB; 

Bu işlem "kopya" veriler:

ATTACH DATABASE "myother.db" AS aDB; 

Bundan sonra, CREATE TABLE sözdizimini kullanabilirsiniz. Eğer verileri birleştirmek istiyorsanız , aynı zamanda bir INSERT [3] ifadesi yoktur, ama bununla birlikte böyle alanlarınızı başvurması gerekecektir:

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

Referanslar:

[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 bana hızlı tablo oluşturma hatırlatmak & ile kopyalamak için "aDB.oldTableInMyOtherDB AS SELECT * FROM TABLO newTableInDB1 CREATE;" –

+0

iyi açıkladı. ios objc beton kodunda yazabilirseniz harika olur. – OMGPOP

+0

Komutlar salt SQL'dir, bunları sqlite3_exec() çağrısı ile yürütürsünüz. – Zuppa

0

str saat sonra SO üzerinde uggle, ve yukarıdaki yazının yardımıyla, sonunda bunu yapmak için Objective-C kodu oluşturabiliyordum.

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

Sadece kapatmamanız durumunda veritabanını DETACH DATABASE phase2_db ile ayırmayı unutmayın. – Zuppa