テーブルを再作成せずに、私のデバイス上で事前に移入されたSQLiteデータベースをアップグレードする方法

StackOverflow https://stackoverflow.com//questions/9658824

質問

私は以下のコードを持っています。私のAssetsフォルダにSQLiteデータベースファイル(SQLiteデータベースブラウザを使用して作成したことがすでに作成したこと)を正しく読み込みます - それを私のデバイス上の/ data / data / packageName / databes / pathに移動してから、クエリを使用することができます。私の情報を入手するためのカーソルとそれは素晴らしい動作です。コード:

public class DatabaseHelper extends SQLiteOpenHelper {

private Context myDbContext;
private static String dbName = "restaurant.db";
private static String outfilePath = "/data/data/dev.mypackage.com/databases/";
private static String path = outfilePath + dbName;
private static SQLiteDatabase db;

public DatabaseHelper(Context context){
    super(context, dbName, null, 2);
    this.myDbContext = context;
    db = openDb();
    String s = "select * from menu";
    Cursor c = db.rawQuery(s, null);
    Log.e("DB Constructor Row count", String.valueOf(c.getCount()).toString());

    while(c.moveToNext()){
        Log.e("DB Constructor", c.getString(c.getColumnIndex("category")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("menuItem_id")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("title")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("desc")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("price")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("icon")));
    }

    c.deactivate();
    c.close();
}

private void copyDataBase(File dbFile) throws IOException {
    try{
        InputStream dbStream = myDbContext.getAssets().open(dbName);
        OutputStream newDbFile = new FileOutputStream(outfilePath + dbName);

        byte[] buffer = new byte[1024];
        int length;
        while((length = dbStream.read(buffer)) > 0){
            newDbFile.write(buffer);
        }

        newDbFile.flush();
        newDbFile.close();
        dbStream.close();
    }
    catch(IOException e){

        throw new IOException("trying to copy the database - ERROR: " + e.getMessage());
    }   

}

private SQLiteDatabase openDb() throws SQLiteException{
    File dbFile = myDbContext.getDatabasePath(dbName);

    if(!dbFile.exists()){
        Log.e("openDb", "file does not exist");

        try {
            copyDataBase(dbFile);
        } catch (IOException e) {
            throw new RuntimeException("Error creating source database", e);
        }
    }

    return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);

}
public void loadRestaurantInfo(){

}

@Override
public void onCreate(SQLiteDatabase db){
    // TODO Auto-generated method stub      
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
.

今度は、SQLite Browerを使用して、(アセットフォルダ内のデータベース内のデータベース内)に戻ってアドバンスを追加しなければなりませんでした。これは起こっています - (!dbfile.exists())が失敗したため、コピーすることはできません。だから私の質問は - この作品を作るために追加する必要がありますか?私はコードを持つテーブルを作成したことがないので、OnUpgradeメソッドが私にとってどれほど役に立つかがわかりません。

役に立ちましたか?

解決

あなたは3つのオプションを持っています:

  1. onupgrade()を使用する(推奨)

  2. 既存のデータベースを削除して新しいものをコピーする(良い考えではありません)

  3. 既存のデータベースにデータをコピーし、既存のデータベースを削除し、新しいデータベースを削除し、古いデータベースから新しいデータベースにデータを挿入します(新しいデータベーススキーマを新しいデータベーススキーマをアップグレードできる場合はあまりにも多く)挿入します。

    だから、質問に答えるために、テーブルを再作成しなくてもonupgrade()でデータベースをアップグレードします。

    特定のテーブルに新しい行を追加した場合、データベーススキーマは変更されていないため、実行時に新しい行を挿入することができます。もちろん、アプリケーションの目的が何であるかを知らないあなたが簡単にあなたの "静的"データベースへの変更を失うことができるので良い考えではないかもしれません。

他のヒント

物事をする「正しい」方法は、あなたがどのようになったかとはかなり異なります。そこに行くのではなく、あなたがあなたのデータベースの作成方法を維持したいと思います、そして私はそれを使って仕事をすることを提案します。データベースに一列のメタデータがあるテーブルを追加します。これにより、データベースのバージョン(好きなものも好きなものも含めます)。データベースファイルが既に存在する場合は、それを開いてバージョンを確認してください。バージョンが古い場合は、閉じて交換してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top