2017-10-27 15 views
0

私はAndroidアプリケーションを作成し、データベースにアクセス、作成、アップグレードするためにSqliteOpenHelperクラスを拡張しています。古いバージョンのアプリケーションでは、ドメイン名をデータベースに保存していました。将来のバージョンでは、ドメイン名ではなく完全修飾URLを保存するように変更したいと考えています。 (たとえば、「example」を保存するために「www.example.com」を保存するために使用します)。 1つの要件は、アップグレード中にテーブルを削除しないようにして、この値を保持するテーブルを削除し、アップグレード後の完全なURLとして新しい値を書き込むことができないことです。アップグレード時にsqlite3データベースのデータを変更する

データベースのアップグレード時にテーブルなどを変更する方法はわかっていますが、アップグレード中にデータベース内のデータの値をアップグレードする方法があるかどうかは疑いがあります。

Sqliteのマニュアルを検索しましたが、探しているものが見つかりませんでした。

私が持っていた考えの1つは、SqliteOpenHelperのonUpgrade()メソッドでクエリを実行することでした。だから、のようなもの:上記のような戦略は、悪い習慣や私は考えていないよ、この固定のより明確な方法があるかどうかである場合

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    for (int i = oldVersion; i < newVersion; i++) { 
     if (oldVersion == VERSION_SAVING_DATA_AS_DOMAIN) { 
      //Query database for domain 
      //Convert domain to fully qualified url 
      //Write fully qualified url to database 
      //Do database upgrade 
     } 
    } 
} 

わかりません。

+0

forループの代わりにIMOを使用すると、すべてを更新するためのフォールスルーのswitch文を持つ方がよいでしょう – tyczj

答えて

1

これは、スキーマのアップグレードとまったく同じ方法で動作します。 SQLステートメントのみを実行しています。単にあなたが古いバージョンを確認するためにSwitchまたはIfステートメントを使用することができます代わりにAlter Tableなど

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion<2) { 
    // do upgrade from 1 to 2 
    } 

    if (oldVersion<3) { 
    // do upgrade from 2 to 3, which will also cover 1->3, 
    // since you just upgraded 1->2 
    } 

    // and so on 
} 

Updateステートメントを使用します。私は個人的にはIfを好んでいます。私はそれがより読みやすく、秋にははるかに明らかです。

参考: Confusion: How does SQLiteOpenHelper onUpgrade() behave? And together with import of an old database backup?

1

あなたがforループを使用したい理由を私は知りません。現在のバージョンは、例えば4である場合

// Database Version 
private static final int DATABASE_VERSION = 5; 
// Database Name 
private static final String DATABASE_NAME = "exampleDB"; 


private DataBaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    this.context = context; 
} 
[..] 

@Override 
public void onUpgrade(final SQLiteDatabase db, int oldVersion, int newVersion) { 
    if(oldVersion < 3) { 
     //code for upgrading to database version 3 and higher 
     [..] 
    } 
    if(oldversion < 5){ 
     //code for upgrading to database version 5 and higher 
     upgradeToFullyQualifiedUrls(db); 
    } 
} 

、あなたが5にDATABASE_VERSIONを設定し、データベース内のURLを変更し、変更するには、SQL UPDATEクエリを追加する:あなたは、以下の例のように、データベースをアップグレードすることができますURLはif(oldversion < 5)の後です。データベースバージョンが5未満のすべてのバージョンのアプリケーションでは、新しいURLが取得され、バージョンはonUpgradeの後に自動的に5に変更されます。

0

上記の回答は私がここに掲載する私の正確な問題の解決策につながった。

問題は、私は、以前のデータベースバージョンでデータベースに任意のサブドメイン名を書かれ、フォームの文字列にデータベース内のすべての任意のサブドメイン名を変換できるようにしたかったのだということでした:「https://arbitrarysubdomain.example.com」 その他の合併症を以前のデータベースのアップグレードでは、私が最も古いデータベースのバージョンと同じように "arbitrarysubdomain"ではなく "https://arbitrarysubdomain.example.com"と書いていたのです。最後に、既存の値をnullまたは空の文字列にすることができました。この場合、値をnullに変換する必要がありました。ここで

は私の問題を解決し、制約条件を満たしてsqliteの声明です:

UPDATE preferences 
    SET subdomain = CASE WHEN ((SELECT subdomain FROM preferences WHERE subdomain LIKE '%.com') IS NOT NULL) THEN 
          (SELECT subdomain FROM preferences WHERE subdomain LIKE '%.com') 
         WHEN ((SELECT subdomain FROM preferences) IS NOT NULL AND (SELECT subdomain FROM preferences) IS NOT '') THEN 
          'https://' || (SELECT subdomain FROM preferences) || '.example.com' 
         ELSE 
          NULL 
        END; 

だから今ONUPGRADEが実行されると、私は私が私を追加する新しいバージョンに影響を受けた最後のバージョンからアップグレードしていたときに私はこのステートメントを実行します。

この後に書いておきたいもう一つの文は、私の設定テーブルのサブドメイン列の名前をもっと分かりやすいものに変更します。

関連する問題