8

テーブルをaDBから別のbDBにコピーしたい。

だから私はメソッドを作りました。open 2データベースと挿入クエリの使用は機能すると思いますが、詳細な方法はわかりません。

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


}

正しいですか?そしてもっと作る方法は?//ソースからコピー領域。

4

2 に答える 2

22

sqlite3 では、ATTACH[1] と CREATE TABLE .. AS[2] コマンドを組み合わせることができます。

まず、「bDB」データベースを開き、次のステートメントを実行します。

ATTACH DATABASE "myother.db" AS aDB;

その後、CREATE TABLE 構文を使用できます。

CREATE TABLE newTableInDB1 AS SELECT * FROM aDB.oldTableInMyOtherDB;

これにより、データが新しいデータベースに「コピー」されます。データをマージしたい場合は、INSERT[3] ステートメントもありますが、それを使用して、次のようにフィールドを参照する必要があります。

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

参考文献:

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

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

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

于 2012-05-08T20:46:40.997 に答える
0

SO で何時間も格闘した後、上記の投稿の助けを借りて、最終的にこれを行うための Objective-C コードを作成することができました。

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);
}
于 2015-09-16T12:03:16.557 に答える